AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

tunnel problem

Ein Thema von gekmihesg · begonnen am 24. Mär 2004 · letzter Beitrag vom 24. Mär 2004
 
gekmihesg
(Gast)

n/a Beiträge
 
#1

tunnel problem

  Alt 24. Mär 2004, 14:28
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?
  Mit Zitat antworten Zitat
 


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 17:47 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