Avatar billede snotklat Nybegynder
22. oktober 2002 - 14:08 Der er 9 kommentarer og
2 løsninger

Træk en pil mellem 2 punkter

total newbie i delphi...

hvordan trækker jeg en pil mellem 2 punkter, jeg definerer i koden?
Avatar billede armena Nybegynder
22. oktober 2002 - 15:19 #1
hvad mener du ??
Avatar billede diz Nybegynder
22. oktober 2002 - 16:44 #2
du skal tegne på din canvas....feks på en form:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with form1.Canvas do
  begin
    MoveTo(20,30);
    Pen.Width := 5;
    Pen.Color := clRed;
    LineTo(100,100);
  end;
end;

Ovenstående tegner en streg på formen mellem (20,30) og (100,100) når der trykkes på knappen. Så er det bare at ændre disse punkter
Avatar billede snotklat Nybegynder
24. oktober 2002 - 09:25 #3
jo, det virker fint. Men det er jo ikke helt en pil... Bare rolig du skal nok få point for det alligevel :-)
Har kigget på en pil-funktion, ved navn AddArrow. fundet dette i hjælpefilen:

var
    x0,y0,x1,y1 : Double;
begin
    ArrowSeries1.StartXValues.DateTime:=False;
    ArrowSeries1.EndXValues.DateTime:=False;
    ArrowSeries1.Clear;
    x0 :=Random( 1000 );
    y0 :=Random( 1000 );
    x1 :=x0 + Random( 1000 ) - 500 ;
    y1 :=y0 + Random( 1000 ) - 500 ;
    ArrowSeries1.AddArrow( x0, y0, x1, y1, '', clBlue);
    x0 :=Random( 1000 );
    y0 :=Random( 1000 );
    x1 :=x0 + Random( 1000 ) - 500 ;
    y1 :=y0 + Random( 1000 ) - 500 ;
    ArrowSeries1.AddArrow( x0, y0, x1, y1, '', clYellow);

end;

Men kan ikke rigtig få det til og virke, da jeg ikke kan erklære ArrowSeries ordentlig... Nogen der ved hvad jeg skal gøre for at få det til at virke?
Avatar billede diz Nybegynder
24. oktober 2002 - 10:55 #4
Hvor er det du vil tegne pilen henne. For den funktion du har fundet kan vist ike helt bruges overalt :

(taget fra hjælpen)

Applies to

TSeriesMarkPosition component
Avatar billede snotklat Nybegynder
24. oktober 2002 - 11:22 #5
Mener jeg er tæt på at få det til at virke...

Har sat ArrowCha ind i uses

erklæret arrowseries som lokal TArrowSeries variabel..

Mangler kun og kunne Create den ordentlig, men får bare fejlmelding.

Bruger ArrowSeries.create(Form1)

men det virker ikke. Nogen, der kan hjælpe? Kan godt sætte antal point for spørgsmålet op...
Avatar billede hreiff Nybegynder
24. oktober 2002 - 17:27 #6
Du kan evt. selv tegne pilen (af tre streger)

jeg vender tilbage med noget
Avatar billede hreiff Nybegynder
25. oktober 2002 - 10:04 #7
Her er noget der tegner en pil (af 3 linjer) ud fra endepunkterne:

Function retning(x1,y1,x2,y2: integer): real;
{returnerer vinkel i radianer}
var
  dx,dy:integer;
  ret: real;
begin
  dy:=y2-y1;
  dx:=x2-x1;
  Ret:= arctan(abs(dy)/abs(dx));
  if dx >= 0 then
  begin
    if dy >= 0 then
      Ret := -Ret;
  end
  else
  begin
    if dy >= 0 then
      Ret := pi+ret
    else
      Ret :=pi-ret;
  end;
  result := ret;
end;

procedure Pil(x1,y1,x2,y2: integer);
{tegner en pil}
const
  pilL=10; {pillængde}
  pilW=30; {pilvinkel}
var
  vinkel, v: real;
  x,y: integer;
begin
  with form1.Image1.Canvas do
  begin
    Pen.Width := 2;
    Pen.Color := clRed;
    MoveTo(x1,y1);
    LineTo(x2,y2);
    v := pilW*pi/360;
    vinkel := retning(x1,y1,x2,y2);
    x := x2+round(cos(pi+vinkel+v)*PilL);
    y := y2-round(sin(pi+vinkel+v)*PilL);
    Lineto(x,y);
    moveto(x2,y2);
    x := x2+round(cos(pi+vinkel-v)*PilL);
    y := y2-round(sin(pi+vinkel-v)*PilL);
    Lineto(x,y);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  pil(10,90,80,20);
end;
Avatar billede snotklat Nybegynder
25. oktober 2002 - 11:03 #8
ser godt ud..
Avatar billede kfz Nybegynder
04. februar 2003 - 07:40 #9
hreiff, kan du lave proceduren om, da den melder fejl hvis x1 og x2 er det samme pga. at den ikke kan dividere med 0 i denne linie
Ret:= arctan(abs(dy)/abs(dx));
hvis du kan lave en som virker selvom x1 = x2 så er der 50 point til dig
Avatar billede hreiff Nybegynder
04. februar 2003 - 13:24 #10
sæt en kontrol ind på dx (x2-x1):

  if abs(dx) < 1e-10 then
    Ret := Pi / 2
  else
    Ret := arctan(abs(dy)/abs(dx));


Så ser hele retningsfunktionen således ud (selve tegnedelen er den samme):

Function retning(x1,y1,x2,y2: integer): real;
{returnerer vinkel i radianer}
var
  dx,dy:integer;
  ret: real;
begin
  dy:=y2-y1;
  dx:=x2-x1;
  if abs(dx) < 1e-10 then
    Ret := Pi / 2
  else
    Ret := arctan(abs(dy)/abs(dx));
  if dx >= 0 then
  begin
    if dy >= 0 then
      Ret := -Ret;
  end
  else
  begin
    if dy >= 0 then
      Ret := pi+ret
    else
      Ret := pi-ret;
  end;
  retning := ret;
end;
Avatar billede kfz Nybegynder
04. februar 2003 - 16:27 #11
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester