Entwickler-Ecke
Multimedia / Grafik - Linie zeichnen
ene - Fr 30.03.07 12:57
Titel: Linie zeichnen
Hi,
ich habe ein Bitmap. Dort nehme ich mir 2 Punkte und möchte die Mittelsenkrechte darauf zeichen.
Den Mittelpunkt und die Steigung kann ich berechnen, aber wie berechne ich 10 Punkt hoch und runter von der Geraden? Irgendwo hackts da noch bei mir.
JayEff - Fr 30.03.07 13:09
P sei der Ausgangspunkt (TPoint: x,y:integer )
und m die Steigung (integer)
Delphi-Quelltext
1: 2:
| Canvas.MoveTo(P.x, P.y); Canvas.LineTo(P.x + 10, P.y + m * 10); |
Alle Angaben in Pixel.
Horst_H - Fr 30.03.07 13:17
Hallo,
die Mittelsenkrechte hat die Steigung 1/m (==cotan) (m(==tan) natürlich <> 0 )
Gruss Horst
JayEff - Fr 30.03.07 13:18
Titel: Re: Linie zeichnen
ene hat folgendes geschrieben: |
Den Mittelpunkt und die Steigung kann ich berechnen, [...] |
;)
ene - Fr 30.03.07 14:28
@JayEff Klappt, gibt es eine Möglichkeit für LineTo eine andere Farbe zu nehmen? Denn Schwarz auf Schwarz erkennt man nicht gut. Ansonsten muss ich mein Bitmap ändern, was auch kein Problem ist.
@Horst_H s:= (P2y-P1y)/(P2x-P1x); alpha:= tan(s); und mMitte:= alpha+Pi/2; geht auch ;)
Philipp_Reitter - Fr 30.03.07 14:31
Delphi-Quelltext
1:
| image1.Canvas.Color.brush.color:=clRed |
da kann man auch die dicke des striches ändern
ene - Fr 30.03.07 14:41
Tausche Brush durch Pen und schon läufts, vielen Dank!
JayEff - Fr 30.03.07 14:44
Wieder mal der Vollständigkeit halber: Du kannst statt den Konstanten (clRed etc.) auch per RGB(Rot, Gruen, Blau); eine Farbe mischen. Hierbei sind Rot, Gruen und Blau jeweils byte-Werte, also zwischen 0 und 255. 255,255,255 ist weiß, 0,0,0 ist schwarz, wie auch im HTML. (Additive Farbmischung, oder? :gruebel: verwechsle das immer...)
ene - Fr 30.03.07 14:47
Vielen Dank der Vollständigkeit halber. Um dich dann zu necken, sei noch erwähnt, dass man für RGB die Unit Windows braucht ;) *duck&lauf*
JayEff - Fr 30.03.07 14:49
ene hat folgendes geschrieben: |
Um dich dann zu necken, sei noch erwähnt, dass man für RGB die Unit Windows braucht |
...die meistens sowieso schon im Projekt eingebunden ist. *Hat das letzte Wort* :twisted:
ene - Fr 30.03.07 14:56
Aber nicht, wenn man in einer separaten Unit arbeitet und erst recht nicht, wenn man in einer Konsolenanwendung arbeitet. *Over&Out* :P
delfiphan - Fr 30.03.07 17:23
ene hat folgendes geschrieben: |
wie berechne ich 10 Punkt hoch und runter von der Geraden? Irgendwo hackts da noch bei mir. |
JayEff hat folgendes geschrieben: |
P sei der Ausgangspunkt (TPoint: x,y:integer )
und m die Steigung (integer)
Delphi-Quelltext 1: 2:
| Canvas.MoveTo(P.x, P.y); Canvas.LineTo(P.x + 10, P.y + m * 10); |
Alle Angaben in Pixel. |
Die Frage war doch, wie man die Koordinaten zweier Punkte auf der Mittelsenkrechten in jeweils 10 Pixel Entfernung zum Mittelpunkt findet. Die Länge der Linie oben ist i.A. länger als 10. Die ist einfach 10 Pixel in x-Richtung. Ist das wirklich, was du wolltest?
Ich würde auch nicht mit der Steigung rechnen, da diese nicht unbedingt definiert ist. Mein Lösungsvorschlag deswegen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Mittelsenkrechte(Canvas: TCanvas; A, B: TPoint); const C = 10; var L: Extended; V: TPoint; begin V.X := B.X-A.X; V.Y := B.Y-A.Y; L := Sqrt(Sqr(V.X)+Sqr(V.Y)); if L>0 then with Canvas do begin MoveTo(Round(A.X+V.X/2-V.Y/L*C),Round(A.Y+V.Y/2+V.X/L*C)); LineTo(Round(A.X+V.X/2+V.Y/L*C),Round(A.Y+V.Y/2-V.X/L*C)); end; end; |
JayEff - Fr 30.03.07 17:34
Yup, die linie ist in den meisten Fällen länger als 10 px. Aber ich hatte auch garnicht den Anspruch, sie 10 Pixel lang zu machen, das hatte ich falsch verstanden :(
ene - Mo 02.04.07 08:02
Die 10 Pixel waren erst mal nur zum Schauen, ob es in die richtige Richtung geht. Die Länge muss ich rekursiv ermitteln, da sie unterschiedlich ist. Ich arbeite dann mit einem Floodfill.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!