Ellipse (Canvas->Arc) bereits beim Zeichnen voll anzeigen?



  • Das Fertigstellen einer ungefüllten Ellipse geht ja im OnMouseUp durch nochmaliges Canvas->Arc mit vertauschtem Start- und Zielpunkt.

    Image->Canvas->Arc(Origin.x,Origin.y,MovePt.x,MovePt.y,MovePt.y,MovePt.x,Origin.y,Origin.x);
            Image->Canvas->Arc(Origin.x,Origin.y,X,Y,Y,X,Origin.y,Origin.x);
            Image->Canvas->Arc(MovePt.x,MovePt.y,Origin.x,Origin.y,Origin.y,Origin.x,MovePt.y,MovePt.x);
            Image->Canvas->Arc(MovePt.x,MovePt.y,X,Y,Y,X,Origin.y,Origin.x);
    

    Beim Aufziehen funktioniert das aber nicht. Ich bring jedenfalls nur Arc zustande. Hab die verschiedensten Varianten durchprobiert. Kennt jemand die Lösung oder geht das nur unter NT mit dem entsprechenden API?



  • 😕 Was hast du vor mit den ganzen Bögen (Welche Ausgabe willst du erreichen).

    P.S. :
    Schonmal meinem Hinweis dein BrushCopy Problem betreffend nachgegangen ?



  • Au ja, da dank ich dir für den Hinweis, @etechniker. Da nur ein kurzes Stück zu ergänzen ist, um den Vollkreis zu bekommen, genügt

    Image->Canvas->Arc(Origin.x,Origin.y,MovePt.x,MovePt.y,MovePt.y,MovePt.x,Origin.y,Origin.x);
            Image->Canvas->Arc(MovePt.x,MovePt.y,Origin.x,Origin.y,Origin.y,Origin.x,MovePt.y,MovePt.x);
    

    Das sieht schon wesentlich besser aus. Aber wie kann ich erreichen, daß bereits beim Zeichnen ein Vollkreis aufgezogen wird? Momentan verwende ich im OnMouseMove den Code für Canvas->Arc:

    Image->Canvas->MoveTo(Origin.x, Origin.y);
        Image->Canvas->Arc(Origin.x,Origin.y,MovePt.x,MovePt.y,MovePt.y,
                    MovePt.x,Origin.y,Origin.x); 
        Image->Canvas->Arc(Origin.x,Origin.y,X,Y,Y,X,Origin.y,Origin.x);
    

    Gibt es da etwas, das eine Vollellipse aufzieht?

    Zum PS: Das war schon mal ein starker Hinweis, den ich nicht kannte. Ich verfolg immer wieder die Code, ob sich da irgendwo die Farbe clWhite ergeben könnte. Ich möchte sagen "nein", kein Hinweis dafür.



  • Die Methode "Ellipse" ist dir bekannt ?



  • Ja, Canvas->Ellipse verwende ich für die gefüllte Ellipse. In dieser Funktion (Circle) will ich eine ungefüllte Ellipse zeichnen. Canvas->Arc verwende ich nur, weil ich nichts geeigneteres kenne oder gefunden hab. Es erfüllt den Zweck, ist aber noch unbefriedigend.



  • Für einen geschlossenen Kreis/Ellipse musst du einfach Start- und Endpunkt auf identische Werte setzen, Null eignet sich dafür hervorragend.

    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
      Canvas->Arc(100,50, X,Y, 0,0, 0,0);
    }
    


  • Oahhh, prima Idee @Jansen, danke. Etwas tüfteln, dann hatte ich es in der dynamischen Anwendungssituation. Jetzt spielt die Function edel und kommt mit 3 Zeilen Code aus. Das Löschen der Spirale, die beim Aufziehen entsteht - im Xor-Mode -, klappt blitzsauber, man sieht nichts davon.

    // Im OnMouseMove
        Image->Canvas->MoveTo(Origin.x, Origin.y);
        Image->Canvas->Arc(MovePt.x,MovePt.y,Origin.x,Origin.y,X,Y,X,Y);
        Image->Canvas->Arc(Origin.x,Origin.y,X,Y,MovePt.x,MovePt.y,MovePt.x,MovePt.y);
    
            // Im OnMouseUp
            Image->Canvas->Arc(MovePt.x,MovePt.y,Origin.x,Origin.y,X,Y,X,Y);
    

    Das war's. 🕶



  • Au schade! Beim langsamen Aufziehen bleibt eine Mausspur. Wenn ich jetzt keine Variation übersehen hab, gibt es keine Möglichkeit, mit Canvas->Arc eine geschlossene Ellipse aufzuziehen.

    Es muß aber eine Möglichkeit geben. Der Kreis gehört zu den 4 basalen DrawTools. Ohne ihn bleibt ein Maltool wertlos. Bin für jeden Tip dankbar. Denn ohne ein paar grundsätzliche Features wäre die Arbeit vollkommen sinnlos.



  • Wie wär's wenn du mal etwas mehr Code zeigen würdest, damit man das auch nachvollziehen kann, ohne zB. die ganzen Variablen erst selbst definieren zu müssen?



  • Au ja, sory. Man muß die Variablen kennen, um den Code verstehen zu können.

    TPoint Origin,MovePt;
    Origin = Point(X,Y); // Startpunkt der Aktionen beim OnMouseDown
    MovePt = Point(X,Y); // Move-Punkt


Anmelden zum Antworten