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
user profile iconene 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 //oder welche du halt willst                    

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

user profile iconene 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

user profile iconene hat folgendes geschrieben:
wie berechne ich 10 Punkt hoch und runter von der Geraden? Irgendwo hackts da noch bei mir.

user profile iconJayEff 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// 10 Pixel hoch und runter => 20 Pixel langer Strich
var
 L: Extended;
 V: TPoint;
begin
 // Vektor zwischen A und B
 V.X := B.X-A.X;
 V.Y := B.Y-A.Y;
 // Länge berechnen
 L := Sqrt(Sqr(V.X)+Sqr(V.Y));
 // Mittelsenkrechte zeichnen
 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.