Zeichnen von Kreisausschnitten
-
Hallo,
Ich arbeite gerade an einem 'Postprocessor' zur Erzeugung von NC-Steuerprogrammen. Dazu entnehme ich die Koordinaten der Werkzeugbahn aus einem CAD-Programm und bearbeite diese.
Die Ausgabe soll unter anderem auch eine Grafik der Werkzeugbahn enthalten.
Da die Länge der Werkzeugbahn sehr groß werden kann (X-Ausdehnung bis maximal 2,6 m) muß ich für die Ausgabe auf dem TImage einen Maßstab berechnen.
Die Ausgabe wird auch ordentlich gezeichnet (habe ich bis gestern gedacht).
Jetzt ist folgendes Problem aufgetaucht: Wenn ein sehr kleines Stück Kreisbogen gezeichnet werden soll, dann wird nicht der Kreisbogen gezeichnet, sondern ein Vollkreis.(Die Koordinaten der NC-Ausgabe sind i.O., das heißt das die Bahn an der Maschine korrekt ist)Die Kreisbögen werden mit folgender Funktion gezeichnet:
if (drawliste[x].g==2) { SetArcDirection(grafik->Canvas->Handle,AD_COUNTERCLOCKWISE); } else { SetArcDirection(grafik->Canvas->Handle,AD_CLOCKWISE); } grafik->Canvas->Arc(RoundTo(((mp_z*mass_st)+tra_z)-_radius,-3),RoundTo(((mp_x*mass_st)+tra_x)-_radius,-3), RoundTo((mp_z*mass_st)+tra_z+_radius,-3),RoundTo((mp_x*mass_st)+tra_x+_radius,-3), RoundTo((start_z*mass_st)+tra_z,-3),RoundTo((start_x*mass_st)+tra_x,-3), RoundTo((drawliste[x].z*mass_st)+tra_z,-3),RoundTo((drawliste[x].x*mass_st)tra_x,-3)); grafik->Canvas->MoveTo(RoundTo((drawliste[x].z*mass_st)+tra_z,-3),RoundTo((drawliste[x].x*mass_st)+tra_x,-3));
Ich hoffe, das unter Euch ein Experte ist, der dieses Verhalten deuten kann.
Gruß Udo
-
Ohne die ganzen Variablen kann man das irgendwie nicht nachvollziehen.
In welchen Wertebereichen liegen denn die einzelnen Variable?
Sind das double oder int Werte?
hast du mal die letzten 4 Werte, die du an Arc übergibst, überprüft?
-
Danke für Deine Antwort.
Ich komme erst am Montag wieder an den Quelltext für dieses Projekt und werde mich dann wieder melden (mit genaueren Infos)Gruß Udo
-
Hallo,
@Linnea:
ich habe mal die relevanten Koordinaten in eine Stringliste ausgegeben.Villeicht nützen Dir die Koordinatenangaben etwas.
Hier ein Ausschnitt:drawliste[83].g = 2 Canvas->Arc(-51,212.7,249,512.7,99,212.7,85.729,213.288) drawliste[83].g = 2 Rechteck, welches den Kreis einschließt: X1,Y1: -51,212.7 X2,Y2: 249,512.7 drawliste[84].g = 3 Canvas->Arc(82.463,207.3,88.463,213.3,85.729,213.288,85.463,213.3) drawliste[84].g = 3 Rechteck, welches den Kreis einschließt: X1,Y1: 82.463,207.3 X2,Y2: 88.463,213.3 drawliste[86].g = 3 Canvas->Arc(78.313,207.3,84.313,213.3,81.313,213.3,80.843,213.263) drawliste[86].g = 3 Rechteck, welches den Kreis einschließt: X1,Y1: 78.313,207.3 X2,Y2: 84.313,213.3
Der Vollkreis wird gezeichnet bei 'drawliste[84]'.
drawliste.g ist die Richtung des Kreisbogens (Uhrzeigersinn oder gegen Uhrzeigersinn).Gruß Udo
-
Bei den Werten ist ein Kreis kein Wunder. Arc verlangt Integer-Werte, d.h. alle deine Werte werden gnadenlos abgeschnitten, was folglich zu folgenden Werten führt:
drawliste[84].g = 3 Canvas->Arc(82,207,88,213,[u]85,213[/u],[u]85,213[/u]);
Du siehst die letzten beiden Wertepaare sind die gleichen, d.h. der Kreisbogen geht von dem gleichen Punkt los in dem er auch endet, wobei anscheinend die Richtung keinerlei Relevanz hat.
Bei so kleinen Werten solltest du versuchen die Werte auf ganze Zahlen zu runden, was dann entsprechend zu
drawliste[84].g = 3 Canvas->Arc(82,207,88,213,[u]86[/u],213,85,213);
führt und damit auch zu einem Kreisbogen.
-
LINNEA schrieb:
Du siehst die letzten beiden Wertepaare sind die gleichen, d.h. der Kreisbogen geht von dem gleichen Punkt los in dem er auch endet, wobei anscheinend die Richtung keinerlei Relevanz hat.
Genau so isses in Microsaft Windoof.
Wenn Start und Endwinkel gleich sind, wird der Vollkreis (Ellipse) gezeichnet in der Win-API. Und der Hat ja keine wirkliche Richtung.Runden ist ne Möglichkeit, dann malt das Tool aber einen (ein wenig) zu langen Strich.
Du kannst auch testen, ob die "abgeschnittenen Koordinaten" gleich sind:
wenn ja, zeichne nur Linie von Start zu Ende, ist eh nur maximal ein Pixel lang in dem Fall. Dann steht definitiv nix über.Gruss
Frank
-
Danke für Eure Antworten. An den Fall habe ich garnicht gedacht.
Ich habe in der Ausgabe auf 3 Stellen nach dem Komma gerundet.
Funktionsparameter sind natürlich Integer (manchmal sieht man die gröbsten Fehler nicht!!!).
Ich werde beide Varianten mal testen (auf ganze Zahlen runden bzw. nur eine Gerade zeichnen).
Danke für Eure Hilfe. Meistens genügt ein Anschieben in die richtige Richtung.Gruß Udo