AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?
Thema durchsuchen
Ansicht
Themen-Optionen

zentralperspektive(Fluchtpunkt) auf einen Canvas Anwenden ?

Ein Thema von mimi · begonnen am 11. Mai 2010 · letzter Beitrag vom 15. Mai 2010
 
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#16

Re: zentralperspektive(Fluchtpunkt) auf einen Canvas Anwende

  Alt 14. Mai 2010, 19:49
Also, da ihr mir nicht helfen Wollt oder Glauben wollt hier der Beweis das es doch geht:
Delphi-Quellcode:
unit umy3dtype;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Graphics;

type
  TPoint3D = record
    x,y,z:Integer;
  end; // TPoint3D

  function Point3DTo2D(const x, y, z, a:Integer):TPoint;
  function Point3D(const x,y,z:Integer):TPoint3D;

  procedure Draw3DRect(Canvas:TCanvas; const P1, P2, P3, P4:TPoint3D; const a:Integer; const ViewPoint:TPoint);

implementation

function Point3DTo2D(const x, y, z, a: Integer): TPoint;
begin
  result.x:=(a*x) div z;
  result.y:=(a*y) div z;
end; // Point3DTo2D

function Point3D(const x, y, z: Integer): TPoint3D;
begin
  result.x:=x;
  result.y:=y;
  result.z:=z;
end; // Point3D

procedure Draw3DRect(Canvas:TCanvas; const P1, P2, P3, P4:TPoint3D; const a:Integer; const ViewPoint:TPoint);
var
  TempPoint:TPoint;
  Points:array[0..3] of TPoint;
  px,py:Integer;
begin
// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P1.x, P1.y, P1.z, a);
  Points[1]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P2.x, P2.y, P2.z, a);
  Points[0]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P3.x, P3.y, P3.z, a);
  Points[2]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);

// px:=(a*P1.X) div P1.Z;
// py:=(a*P1.Y) div P1.Z;
  TempPoint:=Point3DTo2D(P4.x, P4.y, P4.z, a);
  Points[3]:=Point(ViewPoint.X+TempPoint.X,ViewPoint.Y+TempPoint.Y);
  Canvas.Polygon(Points)
end; // Draw3DRect

end.

// Angewendet:
  // Rechts
  Draw3DRect(Canvas, Point3D(5,10,10), Point3D(10,10,10), Point3D(5,10,15), Point3D(10,10,15),a, Point(cx, cy));
  // Mitte
  Draw3DRect(Canvas, Point3D(0,10,10), Point3D(-5,10,10), Point3D(0,10,15), Point3D(-5,10,15),a, Point(cx, cy));
  // Links
  Draw3DRect(Canvas, Point3D(-10,10,10), Point3D(-14,10,10), Point3D(-10,10,15), Point3D(-14,10,15),a, Point(cx, cy));
  // Mitte, weiter Vorne
  Draw3DRect(Canvas, Point3D(0,10,5), Point3D(-5,10,5), Point3D(0,10,8), Point3D(-5,10,8),a, Point(cx, cy));
  // Rechts, weiter Vorne
  Draw3DRect(Canvas, Point3D(5,10,5), Point3D(10,10,5), Point3D(5,10,7), Point3D(10,10,7),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(5,10,20), Point3D(10,10,20), Point3D(5,10,22), Point3D(10,10,22),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(-10,10,20), Point3D(-14,10,20), Point3D(-10,10,22), Point3D(-14,10,22),a, Point(cx, cy));

  Draw3DRect(Canvas, Point3D(0,10,30), Point3D(-5,10,30), Point3D(0,10,36), Point3D(-5,10,36),a, Point(cx, cy));
end; // TMySkyroads.Paint
Das Result sieht ihr im Anhang. Mehr wollte ich am Anfang an eigentlich nicht. Diese Unit habe ich erstellt und die Grundlage hatte ich gestern erstellt, wie gesagt, dankt zwei IRC-Usern.

Edit01: Die Kamara kann ich mit den Pfeiltasten ändern. Wenn ich den A wert entsprechend Anpasse, das passiert im Moment in der KeyDown Methode, meiner Komponente. Die nächste Frage ist: Wie kann ich eine Vereinfachte Funktion schreiben, wo ich nur zwei Punkte angebe: Den Oberen, Linken und den Unteren Rechten. Sonst hätte ich schon eine recht gute Grundlage für mein Vorhaben, oder ? *freu*

edit02: Ich glaube, a ist doch nicht die Kamara.... weil, es wird immer langsamer, wenn ich weiter in die Tiefe gehe.... aber mal schauen.....
Angehängte Grafiken
Dateityp: png bild07_268.png (4,9 KB, 24x aufgerufen)
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  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:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz