如题,现在有一个需求,在已知x,y,z三个坐标值的情况下,怎样编写一个函数putpoint3d(x:integer;y:integer;z:integer)在屏幕上画出这个点?如何实现呢?希望给出源码.解决问题立马揭帖!
解决方案 »
- BDE连接如何改为ADO连接
- sql 数据库 日期时间的转换
- 如何获取已安装程序的图标,类似控制面版中的添加删除程序
- 請教一個窗口顯示問題?
- 怎样删除已安装的控件
- 在线求助:Filter问题
- 我在写一个监控程序时.想得到在别的程序中的鼠标单击事件.请各位高手指点一下.
- 各位大虾:请问在Delphi6中怎么才能判断一个TADOTable组件是否连接数据库成功?
- 我用了VCLZIP但在编译是说[Error] File not found: 'kpZCnst.res',为什么?
- 关于DELPHI中对位图操作的问题
- 我建了一个MTS object, 在那里怎么重载两个名称相同的方法呀?
- 已知一个窗口的HWND,怎么创建以此窗口为Parent的另一个Form?
Y=y+z*sinA,
A为z轴与x轴的交角
不,我是希望能在一个三维的坐标上描多个点.最好能找个给出x.y.z三个参数就可以直接在屏幕上或窗体上画出这个点的函数.
如果是DX或者OPENGL直接画就行了(估计不是,否则你也不用到这里来问了)
如果是用GDI画的话就像楼上一位说的那样,要自己进行坐标转换
至于你的要求,无非是将Z坐标的计算自动转换罢了前提是你定义的坐标轴的角度是多少(视角)然后就是初中的数学了举个例子
|Y /Z
| /
| /
| /
| /---------. A'
| /----------|--- .A 屏幕坐标(100,50)
| / | | 3D坐标(100,50,-10)
| / ) 45度 | |
--------------------------------------------------------------------------X
|
|
|
|
|
|
|
|
CSDN不能贴图 :(我都不知道我画了些什么,你知道了吗?呵呵
以前没有接触过此类问题,delphi也是刚刚开始学,所以很菜!^_^
其实我就是希望直接用opengl,可是如何实现呢?能否给出源码?多谢!
是二维的,但是,如何把世界坐标中物体画到设备坐标系中,
这个叫投影,简单来说,也可以叫坐标系变换,再简单点说,
就是世界坐标中物体的三维坐标 X 一个变换矩阵 = 设备坐标系坐标。
(相关的概念,不妨看看OPENGL的书)。我作过这样一个小东西(不是用OPENGL,直接Canvas画):
假设在世界坐标中,垂直向上作Z轴,水平向前的视线为Y轴(X轴不用说了),
然后,你用这个坐标系把物体的坐标描出来,然后绕X、Z轴分别旋转一个角度,
最后投影到设备坐标系的二维平面中:(你可以拿个实物来比画一下):
function MyXYZRotate(var p:TNewPoint;AngleX,AngleZ:Double ):TNewPoint; //ÈÆXÖáºÍZÖáÐýת
var CosAngleX,CosAngleZ,SinAngleX,SinAngleZ:Double;
begin
// ÊÀ½ç×ø±êϵ ת»»³É É豸×ø±êϵ AngleX:=AngleX*Pi/180; AngleZ:=AngleZ*Pi/180; CosAngleX:=RoundTo(Cos(AngleX), -5) ;
SinAngleX:=RoundTo(Sin(AngleX), -5) ; CosAngleZ:=RoundTo(Cos(AngleZ), -5) ;
SinAngleZ:=RoundTo(Sin(AngleZ), -5) ; p.x := RoundTo(p.x, -5) ;
p.y := RoundTo(p.y, -5) ;
p.z := RoundTo(p.z, -5) ;
Result.x:=RoundTo((p.x*CosAngleZ+p.y*SinAngleZ)/ScaleW , -5) ;
Result.y:=RoundTo((p.y*CosAngleZ*CosAngleX-p.x*SinAngleZ*CosAngleX+p.z*SinAngleX)/ScaleW, -5) ;
Result.z:=RoundTo((-p.y*CosAngleZ*SinAngleX+p.x*SinAngleZ*SinAngleX+p.z*CosAngleX)/ScaleW , -5) ;
//Result.z:= Result.z - Round(Result.x div 2);
//Result.x:= Result.x + Round(Result.x div 3);
end;