AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Richtungs bzw. Vektorpfeil zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Richtungs bzw. Vektorpfeil zeichnen

Ein Thema von Cyberstorm · begonnen am 29. Jun 2007 · letzter Beitrag vom 29. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#1

Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 19:12
Hallo.

Ich verfolge Dinge über eine Webcam um will die Bewegung durch Pfeile darstellen.
Das Ganze soll dann auf einem Bitmap ausgegeben werden.

Ich habe den Start- und Endpunkt und kann sozusagen die Grundlinie des Pfeils zeichnen:
Delphi-Quellcode:
FBitmap.Canvas.MoveTo(mid_old.x, mid_old.y);
FBitmap.Canvas.LineTo(mid.x, mid.y);
die differenz zurletzten x/y position kann errechnet werden über
Delphi-Quellcode:
mid.x - mid_old.x
mid.y - mid_old.y
hat einer ne idee, wie ich da nen pfeil draus machen kann? bzw. nen anderen lösungsansatz?
sollte relativ fix gehen, da ein paarmal die sekunde aktualisiert wird.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 19:38
mit dem dx und dy hast du den Winkel alpha des Pfeiles zur horizontalen. Jetzt zeichnest du von der Spitze deines Pfeiles ausgehend zwei Striche mit passenden Winkeln. Wie das jetzt genau aussieht, will ich mir nicht überlegen, aber mit etwas hinzeichnen undTrigonometrie ist das zu machen. Auf die geschiwndigkeit brauchst du dabei überhaupt nicht zu achten. Eine sinus Berechnung braucht bei mir etwa 200 Ticks und wenn du einen GigaHertz-Rechner hast, kannst du mal kurz ausrechnen, wie viele Sinusse da pro Sekunde berechnet werden können
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 22:32
Die entsprechende Mathematik:

tan alpha = m
m = (y2-y1) / (x2-x1)

<-> alpha = arctan((y2-y1) / (x2-x1));

dann addierst du zu alpha 30° für eine seite der pfeilspitze, ziehst von alpha 30° ab für die andere seite.

wir setzen l = länge der pfeilspitze.

die koordinaten rechnest du dann mit sinus und cosinus aus:

x = cos(alpha±30°) * l
y = sin(alpha±30°) * l
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#4

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 23:03
also danke erstmal für die antworten.
ja, mit der mathematik is nich so dolle bei mir :-/.

glaube ich habe das nen bissel falsch umgesetzt, weil ich den anfang nicht so ganz kapiere:

Delphi-Quellcode:
if (x1 - x2)<>0 then a:=arctan((y1 - y2) / (x1 - x2));
FBitmap.Canvas.LineTo(Round(cos(a-30)), Round(sin(a-30)));
dachte er zeichnet mir jetzt eine seite aber bei den werten kommt quark raus
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 23:10
Die Koordinaten sind natürlich Offsets!

Delphi-Quellcode:
if (x1 - x2)<>0 then a:=arctan((y1 - y2) / (x1 - x2));

//FBitmap.Canvas.MoveTo(x2,y2); //Der Zeichenstift sollte ja noch am Ende des Pfeils stehen.
FBitmap.Canvas.LineTo(x2-Round(cos(a-30)*3), Round(y2-sin(a-30)*3));
FBitmap.Canvas.LineTo(x2-Round(cos(a+30)*3), Round(y2-sin(a+30)*3));
FBitmap.Canvas.LineTo(x2,y2);
Damit sollte er das komplette Dreieck zeichnen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#6

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 29. Jun 2007, 23:46
hmm habs mit mehreren offsets getestet aber kommt nur quark bei raus.
die verschiebung für x und y liegt jeweils bei ca. -20 bis +20.

hier mal der originalcode villeicht bin ich ja blind.
Delphi-Quellcode:
FBitmapOld2.Canvas.MoveTo(mid_old.x, mid_old.y);
FBitmapOld2.Canvas.LineTo(mid.x, mid.y); {die linie wird korrekt gezeichnet}
if (mid.x - mid_old.x)<>0 then a:=arctan((mid.y - mid_old.y) / (mid.x - mid_old.x));
FBitmapOld2.Canvas.LineTo(Round(cos(a-30)*3), Round(sin(a-30)*3));{hier gehts dann ab richtung 0/0}
FBitmapOld2.Canvas.LineTo(Round(cos(a-30)*3), Round(sin(a-30)*3));
FBitmapOld2.Canvas.LineTo(mid.x, mid.y);
so sieht das z.b. im mom bei ner handbewegung nach oben rechts aus (blaue linien):
http://cyberstorm.hopto.org/test.jpg
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 30. Jun 2007, 00:12
Hm. Ich verpack das mal in eine Prozedur, damit wir da nicht eventuell irgendwelche Variablen verwechseln:

Delphi-Quellcode:
function degtorad(angle : Double) : Double;
begin
   result := pi * angle / 180;
end;

function radtodeg(angle : Double) : Double;
begin
   result := 180 * angle / pi;
end;

procedure DrawArrow(Canvas: TCanvas; StartP, EndP: TPoint);
const
  OffsetAngle = 30;
  ArrowLength = 10;

var
  LineAngle: Integer;
  ArrowLine1,ArrowLine2: TPoint;
begin
  LineAngle := Round(RadToDeg(arctan((EndP.Y-StartP.Y) div (EndP.X - StartP.X))));

  ArrowLine1.X := Round(EndP.X + cos(DegToRad(LineAngle+OffsetAngle))*ArrowLength);
  ArrowLine1.Y := Round(EndP.Y + sin(DegToRad(LineAngle+OffsetAngle))*ArrowLength);

  ArrowLine2.X := Round(EndP.X + cos(DegToRad(LineAngle-OffsetAngle))*ArrowLength);
  ArrowLine2.Y := Round(EndP.Y + sin(DegToRad(LineAngle-OffsetAngle))*ArrowLength);


  Canvas.MoveTo(StartP.X,StartP.Y);
  Canvas.LineTo(EndP.X,EndP.Y);
  Canvas.LineTo(ArrowLine1.X,ArrowLine1.Y);
  Canvas.LineTo(ArrowLine2.X,ArrowLine2.Y);
  Canvas.LineTo(EndP.X,EndP.Y);
end;
Hrmpf.

Macht immer noch nicht wirklich was er machen soll.

EDIT: Update. Macht inzwischen immerhin Sachen, die wie Pfeile aussehen, aber ich muss anscheinend doch Unterscheidungen für die einzelnen Quadranten einbauen.

EDIT: Kleine Demo gebastelt.
Angehängte Dateien
Dateityp: zip parrow_212.zip (1,3 KB, 43x aufgerufen)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Cyberstorm

Registriert seit: 23. Okt 2003
159 Beiträge
 
Delphi 2010 Architect
 
#8

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 30. Jun 2007, 00:53
Delphi-Quellcode:
procedure ArrowTo(RC:TCanvas;xa,ya,xe,ye,pb,pl:integer;Fill:boolean);
var
  m,t,sqm : real;
  x1,y1,x2,y2,xs,ys,la : real;
begin
  la:=sqrt(sqr(xe-xa)+sqr(ye-ya));
  if la<0.01 then exit;
  t:=(la-pl)/la;
  xs:=xa+t*(xe-xa);
  if xe<>xa then
    begin
      m:=(ye-ya)/(xe-xa);
      ys:=ya+t*m*(xe-xa);
      if m<>0 then
        begin
          sqm:=sqrt(1+1/sqr(m));
          x1:=xs+pb/sqm;
          y1:=ys-(x1-xs)/m;
          x2:=xs-pb/sqm;
          y2:=ys-(x2-xs)/m;
        end
      else
        begin
          x1:=xs; x2:=xs;
          y1:=ys+pb/1.0;
          y2:=ys-pb/1.0;
        end;
    end
  else
    begin
      xs:=xa;
      ys:=ya+t*(ye-ya);
      x1:=xs-pb/1.0;
      x2:=xs+pb/1.0;
      y1:=ys; y2:=ys;
    end;
  RC.MoveTo(xa,ya);
  RC.LineTo(round(xs),round(ys));
  if Fill then
    begin
      RC.Brush.Color:=RC.Pen.Color;
      RC.Brush.Style:=bsSolid;
      RC.Polygon([Point(xe,ye),Point(round(x1),round(y1)), Point(round(x2),round(y2)),Point(xe,ye)]);
    end
  else
    RC.Polyline([Point(xe,ye),Point(round(x1),round(y1)), Point(round(x2),round(y2)),Point(xe,ye)]);
end;
hier gefunden


danke für die mithilfe und inspiration!
  Mit Zitat antworten Zitat
56K-Surfer

Registriert seit: 28. Mär 2005
7 Beiträge
 
Delphi 7 Personal
 
#9

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 14. Aug 2007, 12:13
Zitat von Cyberstorm:
...
Ich habe den Start- und Endpunkt und kann sozusagen die Grundlinie des Pfeils zeichnen:
...
Klingt sehr interessant, hab aber mal eine Frage:
Wie bekommst du denn bis dahin schonmal die position bzw richtungsvektoren aus dem Webcam-Bild?
Sebastian
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Richtungs bzw. Vektorpfeil zeichnen

  Alt 14. Aug 2007, 13:04
Also ich würde die Sache so angehen:
1.) ein "Pfeil" besteht aus 7 Punkten, die mit einem Polygon Zug verbunden werden.
2.) Also muss man erstmal einen Pfeil im Ursprung konstruieren. Die Pfeilspitze sollte (muss aber nicht) im Ursprung
sitzen.
Der Pfeil muss auf kariertem Papier aufgezeichnet und die Koordinaten der einzelnen Punkte abenommen werden.
Delphi-Quellcode:
Pfeil: array[1..7] of TPoint;
pfeil[1] := Point(x1, y1);
....
canvas.Polygon(Pfeil);
3.) da reicht aber noch nicht. Der Pfeil muss vor dem Zeichnen noch gedreht und anschliesend verschoben werden.
siehe Code-Library: http://www.delphipraxis.net/internal...ct.php?t=38391

Wie man sieht, ist diese Technik besser als die bisherigen Vorschläge, da man so nicht nur Pfeile, sondern auch Kreuze und andere Symbole zeichen kann.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz