DirectX9 - Eine Ellipse füllen

  • C#
  • .NET (FX) 4.0

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    DirectX9 - Eine Ellipse füllen

    Hallo, ich berechne die Punkte der Kreisaußenbahn wie folgt:

    C#-Quellcode

    1. var whalfellipse = rectangle.Width/2;
    2. var hhalfellipse = rectangle.Height / 2;
    3. var vertexList = new List<Vector2>();
    4. for (var i = 1; i <= 360; i++)
    5. {
    6. vertexList.Add(
    7. new Vector2(whalfellipse*MathHelper.Cos(i*(float)MathHelper.PiOverOneEighty) + rectangle.Center.X,
    8. hhalfellipse * MathHelper.Sin(i * (float)MathHelper.PiOverOneEighty) + rectangle.Center.Y));
    9. }


    Nun habe ich mir gedacht, ich könnte die Dicke des Pinsels auf 1 reduzieren, und solange Punkte hinzufügen bis der Radius auf 0 gesunken ist:

    C#-Quellcode

    1. var whalfellipse = rectangle.Width / 2;
    2. var hhalfellipse = rectangle.Height / 2;
    3. var vertexList = new List<Vector2>();
    4. while (whalfellipse > 0 || hhalfellipse > 0)
    5. {
    6. for (var i = 1; i <= 360; i++)
    7. {
    8. vertexList.Add(
    9. new Vector2(
    10. whalfellipse*MathHelper.Cos(i*(float) MathHelper.PiOverOneEighty) + rectangle.Center.X,
    11. hhalfellipse*MathHelper.Sin(i*(float) MathHelper.PiOverOneEighty) + rectangle.Center.Y));
    12. }
    13. whalfellipse--;
    14. hhalfellipse--;
    15. }


    Leider sieht das Resultat nicht wie gewünscht aus (siehe Anhang). Habt ihr eine Idee wie ich die Ellipse optimal füllen könnte?
    Bilder
    • ellipse.png

      14,99 kB, 165×132, 264 mal angesehen
    Es gibt durchaus eine Möglichkeit um Linien zu zeichnen. Ich weiß nicht ob das SlimDX spezifisch ist..

    C#-Quellcode

    1. var line = new Line(_direct3D9Device) {Antialias = true, Width = dxPen.Width};
    2. line.Begin();
    3. line.Draw(DirectXHelper.ConvertToVertex(vertexList.ToArray()), DirectXHelper.ConvertColor(dxPen.Color));
    4. line.End();


    Ich habe AntiAliasing deaktiviert und nun sieht es wie gewünscht aus.
    Hi
    schreibe einfach einen Pixelshader und zeichne einen transformierten Kreis. D.h. erst transformierst du die Vertices (dazu Vertices mit U-V-Koordinaten angeben) entsprechend (-->Vertexshader) auf die Ellipsenbahn (-> Strecken, rotieren, verschieben) und dann im Pixelshader abfragen, ob u² + v² <= 1.

    Gruß
    ~blaze~