Autor Beitrag
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Fr 30.03.07 12:57 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.03.07 13:09 
P sei der Ausgangspunkt (TPoint: x,y:integer )
und m die Steigung (integer)
ausblenden Delphi-Quelltext
1:
2:
Canvas.MoveTo(P.x, P.y);
Canvas.LineTo(P.x + 10, P.y + m * 10);

Alle Angaben in Pixel.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Fr 30.03.07 13:19, insgesamt 1-mal bearbeitet
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 30.03.07 13:17 
Hallo,

die Mittelsenkrechte hat die Steigung 1/m (==cotan) (m(==tan) natürlich <> 0 )

Gruss Horst
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.03.07 13:18 
user profile iconene hat folgendes geschrieben:
Den Mittelpunkt und die Steigung kann ich berechnen, [...]
;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
ene Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Fr 30.03.07 14:31 
ausblenden Delphi-Quelltext
1:
image1.Canvas.Color.brush.color:=clRed //oder welche du halt willst					

da kann man auch die dicke des striches ändern
ene Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Fr 30.03.07 14:41 
Tausche Brush durch Pen und schon läufts, vielen Dank!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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)
ausblenden 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:
ausblenden 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;


Zuletzt bearbeitet von delfiphan am Fr 30.03.07 17:35, insgesamt 1-mal bearbeitet
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: 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.