Laden...

gedrehte Ellipse (2 Brennpunke, Höhe) zeichnen

Erstellt von Google10 vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.640 Views
G
Google10 Themenstarter:in
41 Beiträge seit 2007
vor 16 Jahren
gedrehte Ellipse (2 Brennpunke, Höhe) zeichnen

nachdem ich sehr lange erfolglos nach einer funktion gesucht habe, die eine gedrehte
ellipse zeichnet, welche durch zwei Brennpunkte und der Höhe definiert wird,
programmierte ich selbst. Für alle die sich dies ersparen möchten:

 
       private Point[] getEllipse(Point brennpunkt1, Point brennpunkt2, double Höhe, int dämmungsfaktor)
        {
            int x1, y1, x2, y2;
            double b = Höhe;

            if (dämmungsfaktor < 1)
            {
                dämmungsfaktor = 1;
            }

            if (brennpunkt1.X < brennpunkt2.X)
            {
                x1 = brennpunkt1.X;
                y1 = brennpunkt1.Y;
                x2 = brennpunkt2.X;
                y2 = brennpunkt2.Y;
            }
            else
            {
                x2 = brennpunkt1.X;
                y2 = brennpunkt1.Y;
                x1 = brennpunkt2.X;
                y1 = brennpunkt2.Y;
            }

            int brennpunktabstand = Convert.ToInt32(Math.Sqrt(Math.Pow((x1 - x2), 2) + Math.Pow((y1 - y2), 2)));
            int a = Convert.ToInt32(Math.Sqrt(Math.Pow(brennpunktabstand / 2, 2) + Math.Pow(b, 2)));

            Point[] points4 = new Point[a];
            Point[] points3 = new Point[a];
            Point[] points1 = new Point[a];
            Point[] points2 = new Point[a];
            Point[] pointstogether = new Point[4 * a];

            double xkoordinate, ykoordinate;

            for (int i = 0; i < a; i++)
            {
                xkoordinate = i + 1;
                ykoordinate = (b / a) * Math.Sqrt((-1 * Math.Pow(xkoordinate, 2)) + Math.Pow(a, 2));
                points4[i].X = Convert.ToInt32(xkoordinate + a);
                points4[i].Y = Convert.ToInt32(ykoordinate) + Convert.ToInt32(b);

                xkoordinate = i + 1;
                ykoordinate = -(b / a) * Math.Sqrt((-1 * Math.Pow(xkoordinate, 2)) + Math.Pow(a, 2));
                points1[i].X = Convert.ToInt32(xkoordinate + a);
                points1[i].Y = Convert.ToInt32(ykoordinate) + Convert.ToInt32(b);

                xkoordinate = -i - 1;
                ykoordinate = -(b / a) * Math.Sqrt((-1 * Math.Pow(xkoordinate, 2)) + Math.Pow(a, 2));
                points2[i].X = Convert.ToInt32(xkoordinate + a);
                points2[i].Y = Convert.ToInt32(ykoordinate) + Convert.ToInt32(b);

                xkoordinate = -i - 1;
                ykoordinate = (b / a) * Math.Sqrt((-1 * Math.Pow(xkoordinate, 2)) + Math.Pow(a, 2));
                points3[i].X = Convert.ToInt32(xkoordinate + a);
                points3[i].Y = Convert.ToInt32(ykoordinate) + Convert.ToInt32(b);

            }

            int j = a - 1;
            for (int i = 0; i < a; i++)
            {
                pointstogether[i].X = points1[i].X;
                pointstogether[i].Y = points1[i].Y - Convert.ToInt32(b);
                pointstogether[i + a].X = points4[j].X;
                pointstogether[i + a].Y = points4[j].Y - Convert.ToInt32(b);
                pointstogether[i + 2 * a].X = points3[i].X;
                pointstogether[i + 2 * a].Y = points3[i].Y - Convert.ToInt32(b);
                pointstogether[i + 3 * a].X = points2[j].X;
                pointstogether[i + 3 * a].Y = points2[j].Y - Convert.ToInt32(b);
                j--;
            }

            double alpha;

            if (brennpunkt1.X != brennpunkt2.X | brennpunkt1.Y != brennpunkt2.Y)
                alpha = Math.Atan((Math.Abs(Convert.ToDouble(y2 - y1))) / (Math.Abs(Convert.ToDouble(x2 - x1)))) * (180 / Math.PI);
            else
                alpha = 0;

            if (y1 > y2)
                alpha = 360 - alpha;

            double cosalpha = Math.Cos(alpha * Math.PI / 180);
            double sinalpha = Math.Sin(alpha * Math.PI / 180);

            for (int i = 0; i < pointstogether.Length; i++)
            {
                int xneu = Convert.ToInt32(pointstogether[i].X * cosalpha - pointstogether[i].Y * sinalpha);
                int yneu = Convert.ToInt32(pointstogether[i].X * sinalpha + pointstogether[i].Y * cosalpha) + y1;
                pointstogether[i].X = xneu - Convert.ToInt32((2 * a - brennpunktabstand) / 2 * cosalpha) + x1;
                pointstogether[i].Y = yneu - Convert.ToInt32((2 * a - brennpunktabstand) / 2 * sinalpha);

            }

            int anzahlgedämmterpunkte = Convert.ToInt32(pointstogether.Length / dämmungsfaktor);
            Point[] pointsgedämmt = new Point[anzahlgedämmterpunkte];

            for (int i = 0; i < pointsgedämmt.Length; i++)
            {
                pointsgedämmt[i] = pointstogether[i * dämmungsfaktor];
            }

            return (pointsgedämmt);
        }

enjoy 😁