如题,现在有一个需求,在已知x,y,z三个坐标值的情况下,怎样编写一个函数putpoint3d(x:integer;y:integer;z:integer)在屏幕上画出这个点?如何实现呢?希望给出源码.解决问题立马揭帖!

解决方案 »

  1.   

    三维转二维?X=x+z*cosA
    Y=y+z*sinA,
    A为z轴与x轴的交角
      

  2.   

    To:ICMGDCHN((梦醒泪湿襟)->喜欢明月) 
    不,我是希望能在一个三维的坐标上描多个点.最好能找个给出x.y.z三个参数就可以直接在屏幕上或窗体上画出这个点的函数.
      

  3.   

    这个看你用什么做了
    如果是DX或者OPENGL直接画就行了(估计不是,否则你也不用到这里来问了)
    如果是用GDI画的话就像楼上一位说的那样,要自己进行坐标转换
    至于你的要求,无非是将Z坐标的计算自动转换罢了前提是你定义的坐标轴的角度是多少(视角)然后就是初中的数学了举个例子
                                    |Y       /Z
                                    |       /      
                                    |      /
                                    |     /
                                    |    /---------. A'
                                    |   /----------|--- .A   屏幕坐标(100,50)
                                    |  /           |    |    3D坐标(100,50,-10)
                                    | / ) 45度     |    |
    --------------------------------------------------------------------------X
                                    |         
                                    |                  
                                    |
                                    |
                                    |
                                    |
                                    |
                                    |
    CSDN不能贴图 :(我都不知道我画了些什么,你知道了吗?呵呵
      

  4.   

    还画走形了CSDN的回复真成问题
      

  5.   

    TO:myling(AD) 
    以前没有接触过此类问题,delphi也是刚刚开始学,所以很菜!^_^
    其实我就是希望直接用opengl,可是如何实现呢?能否给出源码?多谢!
      

  6.   

    到我的BLOG里看我以前翻译的nehe教程吧http://blog.csdn.net/myling/
      

  7.   

    很就没有回帖了!楼主对世界坐标、设备坐标、窗口坐标的概念看来是不大了解了!在世界坐标中物体是三维的,但是在设备坐标(例如显示器显示)
    是二维的,但是,如何把世界坐标中物体画到设备坐标系中,
    这个叫投影,简单来说,也可以叫坐标系变换,再简单点说,
    就是世界坐标中物体的三维坐标 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;
      

  8.   

    计算机的屏幕是二维的,不管你用什么东西做,最终显示出来,都要投影成二维图像,就看这个投影过程是你自己做,还是由现有的包来做,opengl,dx都提供3维的包供调用。