比如在屏幕绘制一条线!!!我认为我的理解可能不全或是有偏差!!请大家帮助指出!!比如 g.DrawLine(pen, new Point(0, 0), new Point(100, 100));这里的(0,0),(100,100)应该是世界坐标(全局坐标)---然后要转化为页面坐标(指的是将世界坐标映射到页面坐标),如果原点不边的话,也面坐标仍然为(0,0),(100,100)。
然后要进行页面变换(将页面坐标映射到设备坐标),假设没有设置的话。仍然是(0,0),(100,100)。然后再转化为物理设备坐标(这个转化由os决定,没有人工的转化方法)。
此时呈现在屏幕上的图形(也就是直线)的坐标应该为物理设备坐标==设备坐标!!(1)<--我这句话的说法正确么?不过我认为是正确的!!!(2)我有点疑惑的是这个所谓的也面坐标。在msdn上说的是 页面坐标系是指绘图图面(如窗体或控件)使用的坐标系。我的理解是这个也面坐标我们是看不到的,在内存中,我的猜想是不是内存中有个和我们所在屏幕上看到的窗体一样的一个内存中的图形呢?(这里的图形指的是窗体),到这里我就迷糊了。因为我对os了解少,不太明白他们的机制,能不能简要的说一下呀!!(3)这个所谓的设备坐标,msdn上说 设备坐标系是在其上进行绘制的物理设备(如屏幕或纸张)所使用的坐标系--是不是可以理解为我们肉眼看到的屏幕上的客湖区上所使用的坐标呢。原点在在可湖区的左上角的位置!!!????
希望大家帮我指正,共同进步!!!

解决方案 »

  1.   

    物理设备坐标:
    原点:物理设备左上角
    单位:通常为像素
    大小:通常为1024*768
    页面坐标:
    原点:页面的左上角(如果在某个窗体或容器内,就是这个窗体或者容器内部的左上角)
    单位:Display 指定显示设备的度量单位。通常,视频显示使用的单位是像素;打印机使用的单位是 1/100 英寸。  
          Document 将文档单位(1/300 英寸)指定为度量单位。  
          Inch 将英寸指定为度量单位。  
          Millimeter 将毫米指定为度量单位。  
          Pixel 将设备像素指定为度量单位。  
          Point 将打印机点(1/72 英寸)指定为度量单位。  
          World 将世界坐标系单位指定为度量单位。  
          自定义
    大小:根据单位不同,大小很不同举例,比如一个窗体的坐标在屏幕上100,20,窗体内部客户区的起始坐标(相对窗体原点)为3,15,那么客户区起始设备坐标就是103,35
    比如这个窗体客户区的坐标单位为自定义,就是客户自定义的长度5等于一个像素大小,那么我在这个窗体的客户区画线
    g.DrawLine(pen, new Point(0, 0), new Point(100, 100)); 
    也就是从客户区的0,0(左上角)画一个直线到客户区的100,100
    100,100进行单位换算,就是20,20的size,也就是如果使用像素就是从窗体的客户区坐标0,0画一条到20,20的直线
    也就是转化到物理设备坐标就是从0+103,0+35,到20+103,20+35,即103,35到123,55的一条直线。
    这些转化过程了解就可以,平时不需要关心,或者只关心其中一部分,其他工作都是系统自动完成转换工作。
      

  2.   

    现在有一条语句
    g.DrawLine(pen, new Point(0, 0), new Point(100, 100)); 
    当他发出命令后。是经过什么样的过程呈现在屏幕上的呢~~~貌似需要点os的原理来解释下把。我不太明白。谁能给解释下~~~~
      

  3.   

    绘图忒深奥了
    没有研究过
    问问开发地图或者GPS系统的同学吧
      

  4.   

    现在有一条语句 
    g.DrawLine(pen, new Point(0, 0), new Point(100, 100)); 
    当他发出命令后。
    根据页面坐标系的原点(窗体客户区的坐标)、客户区坐标系的单位换算每个点的具体设备坐标,转换方式我在1楼说了,然后根据设备坐标画线就可以了。
      

  5.   

    需要把具体的物理设备抽象出来,比如说在显示器上画还是在打印机上画,不同的设备对调用时的这些参数的解释是不一样的。具体实现上是GDI承担的责任多些,还是设备驱动程序承担的多些,就不清楚了。
      

  6.   

    g.DrawLine(pen, new Point(0, 0), new Point(100, 100)); 
    这个首先要看看g是从哪里建立的!
    如果是在form上建立的那它的坐标就是针对from时原坐标的
    如果是从BitMap上建里的那他就是针对bitmap上的坐标!
    BitMap bitmap = new BitMap(300,300);
    graphics g = g.creatgraphics(bitMap);
    此时g的有效做图范围就是矩形(0,0,300,300)
      

  7.   

    欢迎访问我的blog
    http://blog.csdn.net/dunao
      

  8.   

    举例,比如一个窗体的坐标在屏幕上100,20,窗体内部客户区的起始坐标(相对窗体原点)为3,15,那么客户区起始设备坐标就是103,35 
    比如这个窗体客户区的坐标单位为自定义,就是客户自定义的长度5等于一个像素大小,那么我在这个窗体的客户区画线 
    g.DrawLine(pen, new Point(0, 0), new Point(100, 100)); 
    也就是从客户区的0,0(左上角)画一个直线到客户区的100,100 
    100,100进行单位换算,就是20,20的size,也就是如果使用像素就是从窗体的客户区坐标0,0画一条到20,20的直线 
    也就是转化到物理设备坐标就是从0+103,0+35,到20+103,20+35,即103,35到123,55的一条直线。 
    这些转化过程了解就可以,平时不需要关心,或者只关心其中一部分,其他工作都是系统自动完成转换工作。
    你这些讲 的明明是在2个设备坐标里转换的么。你只是说了一下。从可湖区到屏幕的转换,完全可以用pointtoscreen()实现。
    我的问题是页面坐标到设备坐标的转换~~~.
    “页面坐标的原点、单位和XY轴的方向都可以自定义的,其实转换方式都是一样的,你自己理解的不对还说我说的不对,坐标系转换你搞不清楚就去看看数学方面的东西,我讲的时候怕你不明白,才在最终的坐标上用了设备坐标让你清楚,我如果总是用相对坐标系的相对坐标,你更不明白。图形学的坐标系转换就这么点东西,没有什么难的,关键是数学公式知道,不同坐标系的空间或者平面几何概念要有。”
    数学公式?就是一个“窗口”高和宽与“视口”的高和宽之间的比例关系罢了。不要搞的那么神秘和复杂。还数学公式呢。其实就是一个比例关系!!!
    几个坐标系的空间转换都是通过这个很简单的比例关系来映射转换的~~~“我讲的时候怕你不明白,才在最终的坐标上用了设备坐标让你清楚,我如果总是用相对坐标系的相对坐标,你更不明白”---貌似你很牛么。是不会呀。还是吹牛呀。难道天下人都和你一样理解,太小看天下人了~~~~~~~~~~~``