Og en timer der ser sådan ud private void timer_Tick(object sender, EventArgs e) { TheCube = (ThreeDObject)((ICloneable)TheCubeOriginal).Clone(); // recopy original object TheCube.SortPolygonsInZOrder(); TheCube.RotateAt(TheCube.GetCenter(), AngleCount); AngleCount += 1; Invalidate(); }
Men jeg vil gerne samle det hele i en override on paint metode. Men kan ikke få den til at tegne objektet? Hvordan gør jeg det?
1) Enten bliver det tegnede lavet via noget helt andet kode end den postede - et helt andet sted i dit program. Det burde være let at eftervise dette ved f.eks. at ændre farven på din Brush.
2) ... eller det *er* det viste som bliver kørt; dog med den undtagelse at den sidste del faktisk slet ikke udskriver noget (eller udskriver udenfor området). Det er lidt svært at vurdere for mig eftersom at jeg ikke har set koden for din ThreeDPolygon-klasse.
public class ThreeDPolygon : IComparable, ICloneable { public Color TheColor = Color.Black; public ArrayList Vertices = new ArrayList(); public ThreeDPolygon() { }
float GetZSum(ThreeDPolygon p) { float sum = 0.0f; for (int i = 0; i < Vertices.Count; i++) { sum += ((ThreeDPoint)p.Vertices[i]).Z; }
return sum; }
float GetXSum(ThreeDPolygon p) { float sum = 0.0f; for (int i = 0; i < Vertices.Count; i++) { sum += ((ThreeDPoint)p.Vertices[i]).X; }
return sum; }
float GetYSum(ThreeDPolygon p) { float sum = 0.0f; for (int i = 0; i < Vertices.Count; i++) { sum += ((ThreeDPoint)p.Vertices[i]).Y; }
return sum; }
object ICloneable.Clone() { ThreeDPolygon copyObject = new ThreeDPolygon(); for (int i = 0; i < Vertices.Count; i++) { copyObject.Vertices.Add( ((ICloneable)Vertices[i]).Clone()); }
if (sum1 == sum2) { sum1 = GetXSum(this); sum2 = GetXSum(ptest); if (sum1 > sum2) { return 1; } }
if (sum1 == sum2) { sum1 = GetYSum(this); sum2 = GetYSum(ptest); if (sum1 > sum2) { return 1; } }
return -1; }
ThreeDPoint GetLeftmostPoint() { float xmin = 1000; float ymin = 1000; float zmin = 1000; for (int i = 0; i < Vertices.Count; i++) { ThreeDPoint nextPoint = (ThreeDPoint)Vertices[i]; if (nextPoint.X < xmin) xmin = nextPoint.X; if (nextPoint.Y < ymin) ymin = nextPoint.Y; if (nextPoint.Z < zmin) zmin = nextPoint.Z; }
ThreeDPoint origin = new ThreeDPoint(xmin, ymin, zmin); return origin; }
public ThreeDPolygon(ThreeDPoint[] v) { for (int i = 0; i < v.Length; i++) Vertices.Add(v[i]); }
public void AddPoint(float x, float y, float z) { ThreeDPoint aPoint = new ThreeDPoint(x, y, z); Vertices.Add(aPoint); }
public void Transform(ThreeDMatrix m) { for (int i = 0; i < Vertices.Count; i++) { ((ThreeDPoint)Vertices[i]).Transform(m); } }
public void Scale(float val) { for (int i = 0; i < Vertices.Count; i++) { ((ThreeDPoint)Vertices[i]).Scale(val); } }
public void Translate(float[] v) { for (int i = 0; i < Vertices.Count; i++) { ((ThreeDPoint)Vertices[i]).Translate(v); } }
public void RotateAt(ThreeDPoint origin, float angle) { for (int i = 0; i < Vertices.Count; i++) { ((ThreeDPoint)Vertices[i]).RotateAt(origin, angle); } }
public void RotateX(ThreeDPoint origin, float degrees) { for (int i = 0; i < Vertices.Count; i++) { ((ThreeDPoint)Vertices[i]).RotateX(origin, degrees); } }
public ThreeDPoint GetCenter() { ThreeDPoint p = new ThreeDPoint(0, 0, 0); for (int i = 0; i < Vertices.Count; i++) { p = p + (ThreeDPoint)Vertices[i]; }
p.DivideThePoint(Vertices.Count);
return p;
}
PointF[] GetVertices2D() { PointF[] points = new PointF[Vertices.Count]; for (int i = 0; i < Vertices.Count; i++) { points[i] = ((ThreeDPoint)Vertices[i]).To2D(GetCenter()); }
public void Draw(Graphics g) { Pen aPen = new Pen(TheColor, 1); for (int i = 0; i < Vertices.Count-1; i++) { g.DrawLine(aPen, ((ThreeDPoint)Vertices[i]).To2D(GetCenter()), ((ThreeDPoint)Vertices[i+1]).To2D(GetCenter()));
Hmmm, jeg tror desværre at jeg mangler nogle helt centrale ideer om hvilke værdier du har i dine:
Polygons[i].Vertices
ArrayList.
Jeg synes at du skulle prøve emd noget debug kode som enten skriber værdierne runtime til en fil eller til en MessageBox. Måske er der en fejl i en af dine 3D formler et sted sådan at din terning faktisk tegnes udenfor formen.
Et spørgsmål/råd: Hvorfor ikke bruge generics:
List<ThreeDPoint> Vertices
i stedet for ArrayList. På den måde slipper du for en masse typecasts - hvilket:
1) Gør din kode lettere at læse, og 2) Forbedre performance...
Jo, er jeg da også... Men klassen er bare skrevet for mange år siden. Så den er ikke blevet optimeret siden...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.