Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi tunnel problem (https://www.delphipraxis.net/18771-tunnel-problem.html)

gekmihesg 24. Mär 2004 14:28


tunnel problem
 
mir kam der tolle einfall eine procedur zu schreiben die einen tunnel zeichnet (oder eigendlich nur ein gitternetz eines tunnels).
eigendlich war mir nur gerade langweilig und jetzt bastel ich schon seit 2 tagen dran.
es funktioniert soweit ganz gut aber mit der perspektive haut was nicht richtig hin.
am besten einfach mal an nem image ausprobieren:

Delphi-Quellcode:
procedure Tunnel(cnv: TCanvas;width,height,d:integer;c1,c2,c3:TColor; cp: TPoint);
var
  i,a: integer;
  alpha,beta,n: real;
// width,height: breite/höhe des tunnels
// d: linienabstand
// c123: farben
// cp: mittelpunkt

  procedure cpc(var cnv: TCanvas); // farbe ändern
  begin
    if cnv.Pen.Color = c1 then
      cnv.Pen.Color:=c2
    else
      cnv.Pen.Color:=c1;
  end;

  function cpt(x,y: integer): integer; // "strahlensatz"
  begin
    if x = 0 then result := 0
    else result:=round(((x-i)/x)*y);
  end;

begin
  if cp.X = 0 then cp.X:=1;
  if cp.Y = 0 then cp.Y:=1;

  with cnv do // ecklinien zeichnen
    begin
      Brush.Color:=c3;
      FillRect(rect(0,0,width,height));
      Pen.Color:=c1;
      Pen.Width:=2;
      MoveTo(0,0);
      LineTo(cp.X,cp.Y);
      LineTo(width,0);
      MoveTo(0,height);
      LineTo(cp.X,cp.Y);
      LineTo(width,height);
      Pen.Width:=1;
    end;

  // links/rechts linien zum mittelpunkt
  i:=0;
  cpc(cnv);
  while i <= form2.Image1.Height do
    begin
      cnv.MoveTo(0,i);
      cnv.LineTo(cp.X,cp.y);
      cnv.LineTo(width,i);
      inc(i,d);
    end;

  // oben/unten linien zum mittelpunkt
  i:=0;
  cpc(cnv);
  while i <= width do
    begin
      cnv.MoveTo(i,0);
      cnv.LineTo(cp.X,cp.y);
      cnv.LineTo(i,height);
      inc(i,d);
    end;

  //querlinien

  //links
  i:=0;
  cpc(cnv);
  alpha:=arctan(d/cp.X);
  beta:=((Pi/2)-alpha)/2;
  n:=d;
  while i <= cp.X do
    begin
      cnv.MoveTo(i,cp.Y+cpt(cp.X,height-cp.Y));
      cnv.LineTo(i,cp.Y-cpt(cp.X,cp.Y));
      a:=round(tan(beta)*n);
      if a = 0 then break;
      inc(i,a);
      n:=tan(alpha)*(cp.X-i);
    end;

  //rechts
  i:=0;
  alpha:=arctan(d/(width-cp.X));
  beta:=((Pi/2)-alpha)/2;
  n:=d;
  while i <= width-cp.X do
    begin
      cnv.MoveTo(width-i,cp.Y+cpt(width-cp.X,height-cp.Y));
      cnv.LineTo(width-i,cp.Y-cpt(width-cp.X,cp.Y));
      a:=round(tan(beta)*n);
      if a = 0 then break;
      inc(i,a);
      n:=tan(alpha)*((width-cp.X)-i);
    end;

  //oben
  cpc(cnv);
  i:=0;
  alpha:=arctan(d/cp.Y);
  beta:=((Pi/2)-alpha)/2;
  n:=d;
  while i <= cp.Y do
    begin
      cnv.MoveTo(cp.X+cpt(cp.Y,width-cp.X),i);
      cnv.LineTo(cp.X-cpt(cp.Y,cp.X),i);
      a:=round(tan(beta)*n);
      if a = 0 then break;
      inc(i,a);
      n:=tan(alpha)*(cp.Y-i);
    end;

  //unten
  i:=0;
  alpha:=arctan(d/(height-cp.Y));
  beta:=((Pi/2)-alpha)/2;
  n:=d;
  while i <= height-cp.Y do
    begin
      cnv.MoveTo(cp.X+cpt(height-cp.Y,width-cp.X),height-i);
      cnv.LineTo(cp.X-cpt(height-cp.Y,cp.X),height-i);
      a:=round(tan(beta)*n);
      if a = 0 then break;
      inc(i,a);
      n:=tan(alpha)*((height-cp.Y)-i);
    end;
end;
irgendwie stimmt da was mit den querstrichen nicht. die passen nicht richtig in die perspektive.
wisst ihr wie mans besser macht?

Tyrael Y. 24. Mär 2004 14:49

Re: tunnel problem
 
Ich habe es mal ausprobiert...

..die Perpektive ist doch völlig ok
..oder was stört dich?

gekmihesg 24. Mär 2004 14:55

Re: tunnel problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
nein an den ecklinien stimmen die querlienien nicht überein.
auserdem sind die einzellnen vierecke nur auf höhe des mittelpunkts wirklich quadratisch.

ich glaube mein problem ist ehr mathematischer natur.

fkerber 24. Mär 2004 14:58

Re: tunnel problem
 
Hi!

Häng das Bild doch bitte als JPG an. So isses einfach zu groß.

Danke.

Ciao fkerber

Tyrael Y. 24. Mär 2004 15:01

Re: tunnel problem
 
ah jetzt versteh ich es..

..ich denke das ist ein Rundungsproblem

gekmihesg 24. Mär 2004 15:12

Re: tunnel problem
 
nein wenn man des ganze mit der mausbewegung koppelt sieht man des ganz gut.
aber ich glaub ich finde die lösung gerade. is nur noch rechenaufwändiger.
die querlinien dürfen nicht gerade sein...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 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