tony问题

 

Tony问题的解决


注:本文来自CSDN论坛,这是一次有关透视的应用的热烈讨论。透视是射影几何的基本知识,不学过射影几何就不知道它,就会把它与仿射甚至相似混起来。这次讨论参加的人数有15人之多,只有3-4个人真正了解透视,足见学点射影几何的必要。

本文原不清插图部分已重画,明显无关贴已删除,其余问题待整理。


主  题:  数学问题

提  问  者: tony1978 (突击召唤师) 

等  级:   

信 誉 值: 100

所属论坛: 专题开发 数据结构与算法

问题点数: 100

回复次数: 80

发表时间: 2002-07-19 11:15:18Z


本论坛参与者 :除提问作者tony外,还有14人,如下:

 WGJ0122xdspower, eion(那个谁) ,ccat(智拙) ,

quicmous(快鼠) ,zhenming_liu(), java_skater(skater), 

jojoship(天天聊天) , zzwu(未名) , LeeMaRS(小菜虎,仍需努力) ,

xf8zbf(瞎想) ,dearmite(笨笨的我*_^),  xqr(星球人) , 

hanqiong1(瀚琼)

___________________________________________________________________________________________________________

 

问题:

   计算机屏幕四个顶点(0,0) (1024,0) (0,768), (1024,768)

投影到幕布上的坐标是(a1,b1) (a2,b2) (a3,b3)(a4,b4) 均为

已知,求幕布上任意一点(x,y)在屏幕上的坐标。

 

提示:

   屏幕是一个标准矩形,以左上角为(0,0)。投影可能是一个

倾斜的四边形,以幕布的左上角为(0,0)。

________________________________________________________________________________________________________

  

 

 1。回复人: wgj0122() ( ) 信誉:98  2002-07-19 12:14:10Z  得分:0 

相似形的问题。

过点(X,Y)垂直屏幕沿x轴和y轴作两个平面。剩下的用初中相似形知识就行了。 

Top

 

 2。回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-19 13:00:40Z  得分:0

要是下面这样的形状呢?

tony问题_第1张图片

这是很容易出现的,这时候怎么用相似啊?

 

Top 

 3。回复人: wgj0122() ( ) 信誉:98  2002-07-19 13:14:56Z  得分:0 

你的问题中幕布和屏幕的边是不是平行的呀? 

 

Top 

 4。回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-19 14:13:07Z  得分:0 

用投影仪投在幕布上,实际使用中,投影仪不大可能完全投影出一个矩形。一般是梯形(投影仪光束向上下或左右倾斜),或者不规则的四边形(比如说从左下向右上投影)

 

Top 

 5. 回复人: xdspower() ( ) 信誉:130  2002-07-19 15:34:58Z  得分:0 

其实这个问题是要转换为求两个平面的夹角,再计算一个平面到另一个平面投影 

 

Top 

 6. 回复人: eion(那个谁) ( ) 信誉:100  2002-07-19 16:27:10Z  得分:5 

假定屏幕和幕布都是平面——没有弯曲

 

由于屏幕是光源,所以幕布上影子的大小肯定比屏幕大,

我们可以将屏幕看作是幕布在屏幕所在平面上的投影,

又:三点确定一个平面,所以只需要三个点就OK了,

设对应的顶点为

A : (0,    0  )- (a1, b1) A'

B : (1024, 0  ) - (a2, b2) B'

C : (0,    768) - (a3, b3) C'

D : (1024, 768) - (a4, b4) D'

我们只考虑A,B,C和A',B',C'

 

设屏幕坐标为(x,y)投影导幕布坐标(x',y'),设坐标变换方程为:

x = a*x' + b*y' + c   (1)

y = d*x' + e*y' + f   (2)

 

(注:平面到平面的变换是线性变换,而由(x',y')到(x,y)变换的一般形式就是上面的形式)

将A,B,C 的坐标代入,(1),(2)共由6个方程,6个未知数a,b,c,d,e,f

A,B,C代入第一个方程

0   = a*a1 + b*b1 + c   (3)

1024 = a*a2 + b*b2 + c   (4)

0   = a*a3 + b*b3 + c   (5)

 

(4)-(3)===> 1024 = a*(a2-a1) +b*(b2-b1);    (6)

(4)-(5)===> 1024 = a*(a2-a3) +b*(b2-b3);    (7)

 

(6)*(a2-a3)-(7)*(a2-a1) ==>

1024*(a2-a3)-1024*(a2-a1) =b*(b2-b1)*(a2-a3) - b*(b2-b3)*(a2-a1)

 

所以: b = ??????/??????

代入 (6),求得 a=????/????

代入 (3),求得 c=????/????

 

同理,求得 e,f,g. 

 

Top 

 7. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-19 18:30:39Z  得分:0 

感谢[eion(那个谁)],我会给分的!不过还是有个问题,因为投影仪可能是倾斜的(这个样/或者\)。这时候可以认为屏幕和投影不在同一个坐标系中,两个坐标系是有夹角的。问题的难度大多了。之所以给了四个点,就是因为这个原因。我看到别人的程序要求9个点(屏幕上的一个田字格),因为得不到源码,不知道是怎么算的。 

 

Top 

 8. 回复人: ccat(智拙) ( ) 信誉:100  2002-07-19 19:26:08Z  得分:0 

空间三点可以决定一个平面,四点应当可以了吧,让我想想 

 

Top 

 9. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-19 23:24:07Z  得分:20  

to tony1978(突击召唤师) :

你的问题是射影几何问题,应该采用仿射变换和射影变换的复合变换求解。 eion(那个谁)的解法只考虑了仿射变换,因此无法解决你的疑问。如不清楚我们可继续讨论。 

 

Top 

10. 回复人: zhenming_liu() ( ) 信誉:99  2002-07-20 21:26:14Z  得分:0  

如果坐标系交角是斜的,那可以用linear algebra中坐标系变换的知识,乘以一个matrix就行了,但是这里还有个拉伸的过程,一定需要九个点,譬如,在透影中,以左边和下把边确定的coordinate system和以右边,上边确定的coordinate system所决定的原点的位置是有所不同的,9个点大概是用来判断单位长度随位置的变化的变化的。 

 

Top 

 11. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-20 22:00:25Z  得分:0  

to zhenming_liu() :你说的就是射影几何的射影变换,把n+1维空间的图形投影到n维空间的变换。特点是,直线的投影仍然是直线;一束平行线可能投影成一束共点的直线(类似我们看到平行的铁轨相交于无远点).. 

 

Top 

 12. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-21 16:25:19Z  得分:0  

呵呵,今晚上我给出完整的答案... 

 

Top 

 13. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-21 18:32:08Z  得分:0 

 

一、一般情况 

   设液晶屏坐标为P(x,y,z),银幕射影坐标(请参见射影几何的教材)为P'(x',y',z'),射影变换为:

 

   x' = a11*x + a12*y + a13*z + a14

   y' = a21*x + a22*y + a23*z + a24

   z' = a31*x + a32*y + a33*z + a34

 

   确定该变换需要确定12个系数a[i,j],因此至少需要4对原点和像点。

 

   注,由于点A(x',y',z')和B(x'/z',y'/z',1)在射影平面 z'=1 上,对应同样的像.因此上面的坐标变换实际上包含了两个基本变换:

   (1)液晶屏坐标P(x,y,z)映射到p'(x',y',z'),这里z=0

   (2)P'(x',y',z')投影到平面z'=1上,坐标为(x'/z',y'/z',1),其中(x'/z',y'/z')是银幕坐标;

 

二、本问题解法

 

假设液晶屏上的原点坐标为(x1,y1,z2),(x2,y2,z2),...;

银幕上的映像坐标为(x1',y1',z1'),(x2',y2',z2'),...;

则有:

   (x1,y1,z1)=(0,0,0)

   (x2,y2,z2)=(1024,0,0)

   (x3,y3,z3)=(0,768,0)

   (x4,y4,z4)=(1024,768,0)

   

   x1'/z1' = a1

   y1'/z1' = b1

   x2'/z2' = a2

    y2'/z2' = b2

   x3'/z3' = a3

   y3'/z3' = b3

   x4'/z4' = a4

   y4'/z4' = b4

 

   把上述条件带入坐标变换公式即可利用线性方程组解法求出12个系数. 

 

Top 

 14. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-22 08:29:32Z  得分:0  

还是不明白,旋转怎么办啊?(1024,768)这样的坐标是按照屏幕坐标系,可是屏幕坐标系和银幕是有夹角的啊,是x/y方向的夹角,怎么办?

 

 

Top

 

 15. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-22 08:50:12Z  得分:0 

 

换个角度考虑呢?比如我知道9个点,那么,同一条线上的三个点,(0,0),(512,0),(1024,0)他们的投影(a1,b1),(a2,b2),(a3,b3)已知,一维考虑,可以求得这条投影线上任意一点的源坐标(x,y)。9个点构成一个田字格,投影可能是这样的:

 

 .  *    `

 .  .     .

*  .

           *

 

二维变换,我不太懂了。 

 

Top 

 16. 回复人: eion(那个谁) ( ) 信誉:100  2002-07-22 09:03:15Z  得分:20 

 

只要是平面,三个点就决定了,所以多余3个点的都是多余。

 

但是由于一般的屏幕并非都是纯平面,所以需要近似。这时你可以采用

最小二乘法来求得最贴近的平面变换。否则,象你所说的,为什么有的

人要用9个点来计算?无非是为了减少误差

 

想想,一个平面在另外一个平面上的投影,除了平行是跟原来是一样的

外,其他的,只有坐标的旋转和延伸,坐标的旋转,根据坐标旋转公式

我们知道是一个线性变换,而延伸也是线性变换,所以最后还是线性变

换,正因为是线性变换,所以只需要4个参数(2^2),又因为对原点有

偏移,所以还要加上2个原点坐标

[ x ]  [ a   b ]  [ x' ]   [ c ]

|  | = |       |* |    |  +|   |

[ y ]  [ d   e ]  [ y' ]   [ f ]

       ----+---

            |

            +----这个矩阵表示了两个平面坐标系的变换,

                 如果是正交矩阵,那么就是旋转变换,

                 否则,可以是任意的线性变换,2*2

 

简单一点,如果是一条线投影到另外一条线上,只需要两个点

设原来的点坐标为 x0,x1 投影后坐标为 y0,y1且

|x1-x0| = |y1-y0|

不一定成立,所以坐标变换应该是

x =  a  *x' + b

    -+-

     |

     +-----  一维的为 1*1矩阵

 

正好两个点,两个未知数,可求出 a,b

 

 

 

Top

 

 17. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-22 15:10:43Z  得分:0 

 

看个图http://user.7host.com/oneday/img.gif

投影还是有一点特别

 

Top 

 18. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-22 15:51:30Z  得分:0  

一、一般情况

   我分析了一下我给出的方程,一般情况下估计需要知道6个点才能确定变换的方程。

二、矩形区域

   另外有一个纯几何的方法,问题求解的充分必要条件是在知道“矩形”4个顶点的前提下就足以完成题目。原理如下:

   射影变换保持直线的不变性,即直线的射影仍然是直线。因此,液晶屏幕的中心是液晶屏对角线的交点,其射影必然是投影四边形对角线的交点。

   因此,原则上可以借助于二分法确定像平面与原像平面上点的对应关系。 

 

Top 

 19. 回复人: java_skater(skater) ( ) 信誉:100  2002-07-23 05:44:10Z  得分:0  

大概的想法:

 

     因为不管是屏幕还是幕布都是成比例显示的,所以:

 

     (nx,ny)是屏幕上的坐标。(x,y)是幕布上的坐标。

     

     nx=1024*x/(a4-a1)

 

     ny=768*y/(b4-b1)

 

你参考一下吧,也许对你会有帮助! 

 

Top 

 20. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-23 08:45:19Z  得分:0 

如果像楼上说得那么简单,就不用算了。似乎计算机图形学中有讲到,但是三四年没看了,现在想来很吃力,呵呵。是投影变换

 

Top 

 21. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 13:55:54Z  得分:0 

 

to: tony1978(突击召唤师)

我给出的变换包含两个基本变换:

第一步:把位于xy平面上的屏幕坐标经过仿射变换转换到三维坐标系。这个变换本身包含平移、旋转等几何变换。

第二步:以三维坐标原点为光源的投影变换,投影平面是z=1,公式如下P(x,y,z)->p'(x',y',z')

   x'= x/z

   y'= y/z

如果给出的已知点没有特殊性的话,可能需要6个才能确定变换方程。

 

对于本问题,已知矩形的四个顶点的投影坐标足够了(是充分必要条件)。几何解法如下:

1.液晶屏四个顶点是A,B,C,D,对应的投影是A',B',C',D'.

任给一点P,如果P是AC,BD的交点,则P'是A'C',B'D'的交点。

2.如果P并非AC,BD的交点,

假设ABCD的中心为Q则过Q做AB,AD的平行线m,n,把ABCD分成四个小矩形。P点必定落在其中之一。

同样,过Q的投影Q'做A'B',A'D'的“平行线”(并不一定平行,参见后面的说明)m',n'把A'B'C'D'分成四个部分,P'必然落在和P相对应的四边形区域。

3.关于平行线的投影:

一组平行线投影到一个平面上,有两种可能性:(1)继续保持平行(包括重合);(2)投影成一组相交的直线。

对于本文题,如果A'B'和C'D'相交于T',则m'必然经过T'

上述过程迭代下去,可逐步求出P'的坐标。

到此为止,从理论上给出了解法。 

 

Top 

 22. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 13:57:17Z  得分:0  

to: tony1978(突击召唤师)

我给出的变换包含两个基本变换:

第一步:把位于xy平面上的屏幕坐标经过仿射变换转换到三维坐标系。这个变换本身包含平移、旋转等几何变换。

第二步:以三维坐标原点为光源的投影变换,投影平面是z=1,公式如下P(x,y,z)->p'(x',y',z')

   x'= x/z

   y'= y/z

如果给出的已知点没有特殊性的话,可能需要6个才能确定变换方程。

 

对于本问题,已知矩形的四个顶点的投影坐标足够了(是充分必要条件)。几何解法如下:

1.液晶屏四个顶点是A,B,C,D,对应的投影是A',B',C',D'.

任给一点P,如果P是AC,BD的交点,则P'是A'C',B'D'的交点。

2.如果P并非AC,BD的交点,

假设ABCD的中心为Q则过Q做AB,AD的平行线m,n,把ABCD分成四个小矩形。P点必定落在其中之一。

同样,过Q的投影Q'做A'B',A'D'的“平行线”(并不一定平行,参见后面的说明)m',n'把A'B'C'D'分成四个部分,P'必然落在和P相对应的四边形区域。

3.关于平行线的投影:

一组平行线投影到一个平面上,有两种可能性:(1)继续保持平行(包括重合);(2)投影成一组相交的直线。

对于本文题,如果A'B'和C'D'相交于T',则m'必然经过T'

上述过程迭代下去,可逐步求出P'的坐标。

到此为止,从理论上给出了解法。 

 

Top 

 23. 回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 18:41:10Z  得分:0  

这个题目应该是点光源投影,否则若是平行光投影就太简单了,或是不规则光投影就无法可解.

我有了精确的计算机求解此题的方法,有需要的朋友给我发信讨论吧,

我的信箱是:[email protected] 

 

Top 

 24. 回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 18:45:14Z  得分:5 

 

还是再说明一下吧,点光源投影的话,四边形的可能性很多,也许投影的形状就是一条线段,但多半都是不规则形状,用比例的办法是无法解答的,而且,此题最好用计算机求解,要用到递归的思想,还是和我讨论一下吧,我也想得到最好的解决方法。 

 

Top 

 25. 回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 18:50:17Z  得分:0 

还有,我以为这题无法完全用立体几何的知识解答,quicmous(快鼠) 的思想和我差不多,但他不是考虑的点光源投影,平行光投影用比例的方法解决就完全可以,但点光源不行

 

Top 

 26. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 19:41:01Z  得分:0 

关于点光源投影:

   我在楼上的帖子已经说得很清楚了。如果原像是矩形(或平行四边形),在得到像的四个顶点坐标后就可以确定任意一个原像点的投影坐标(反之亦然)。原因如下:如果我们在液晶屏上画上坐标网格线,如果像是个斜四边形,则水平的网格线将全部交于同一点,竖直网格线全部交于另外一点。

   这方面参考资料可以参阅:射影几何学、画法几何学、测量学、建筑设计、美术(透视学)等。 

 

Top 

27.  回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 19:57:05Z  得分:0 

但是,你是在解决数学问题还是在解决计算机解题的问题呢?

立体坐标的建立就是个迷!

当然,如果有了立体坐标,还用做吗?

A1X+B1Y+C1Z=D1

A2X+B2Y+C2Z=D1

A3X+B3Y+C3Z=D1

这个方程组用线性代数一下下就搞定了呀!

分割的思想我们都有想到,还是来信讨论吧 

 

Top 

 28. 回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 19:58:44Z  得分:0 

坐标变换是个有趣的思想啊 

 

Top 

 29. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 20:03:12Z  得分:0 

给出一个仿射坐标系的解法:

我们以投影四边形的两个相邻的边A'B'和A'D'为轴建立仿射坐标系,可以给出一个解法,至于如何把仿射坐标变换成直角坐标本帖子不予考虑。

原像点A(0,0),B(w,0),C(w,h),D(0,h);(注:显示器的直角坐标)

像点A'(0,0),B'(w',0),C'(w'',h''),D'(0,h'),则有如下射影关系:

A(0,0,0)->A'(0,0,1)

B(w,0,0)->B'(w',0,1)

D(0,h,0)->D'(0,h',1)

C(w,h,0)->C'(w'',h'',1)

由于射影变换为:

x'=(a11*x+a12*y+a13*z+a14)/(a31*x+a32*y+a33*z+a34)

y'=(a21*x+a22*y+a23*z+a24)/(a31*x+a32*y+a33*z+a34)

不妨假设a34=1(因为可能有无数种等价的解,我们只选择其中之一)

a14=0

a24=0

w*a11/(w*a31+1)=w'

a21=0

a12=0

a22*h/(h*a32+1)=h'

w*a11/(w*a31+h*a32+1)=w''

h*a22/(w*a31+h*a32+1)=h''

 

这时:a14=0,a24=0,a21=0,a12=0.对于a11,a22,a31,a32可以通过下面线性方程组求解:

( w   0    -w'w       0 ) (a11)   ( w' )

( 0   h      0        h'h) (a22) = ( h' )

( w   0      -w''w  -w''h) (a31)  ( w'')

( 0   h      -h''w  -h''h) (a41)  ( h'')

 

嗬嗬,我不解了.但已经说明四个点足以确定点光源的射影变换. 

 

Top 

30.  回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 20:08:30Z  得分:0 

平行线的点光源投影并不一定平行,多半有可能投影后会相交的,如果平行的话就好做多了嘛!

点光源S和直线AB、CD确定两个平面,其中AB平行于CD,加上投影面OPQ就是三个平面,SAB与SCD相交于MN,如果MN平行于OPQ,则AB、CD的投影A1B1、C1D1两两平行;如果MN交OPQ于P,则A1B1、C1D1相交于P。这是三个平面相交,交线不平行则交于一点的“美丽”。 

 

Top 

 31. 回复人: jojoship(天天聊天) ( ) 信誉:100  2002-07-23 20:19:18Z  得分:0 

好可爱的坐标变换啊!基础是建立在原平面与投影平面平行基础上的吗?那的确是对的。可是,不平行呢!? 

 

Top 

 32.  回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 21:02:42Z  得分:0 

对于任意四边形,原像四边形也采用仿射坐标,解法和上面差不多。

 

Top 

 33. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-23 21:31:37Z  得分:0  

to jojoship(天天聊天):

你根据影射:

A(0,0,0)->A'(0,0,1)

B(w,0,0)->B'(w',0,1)

D(0,h,0)->D'(0,h',1)

C(w,h,0)->C'(w'',h'',1)

断定原像平面和像平面平行,其实是误解,因为原像到像的变换是一个线性变换和摄影变换构成的复合变换。首先原像经过一个线性变换得到位置可能很“别扭”的中间像,中间像再投影到z=1平面上。正如你能看到的,我在楼上帖子里的方程式是非线性的(射影变换)。 

 

Top 

 34. 回复人: zzwu(未名) ( ) 信誉:106  2002-07-24 08:16:58Z  得分:0   

1.我同意quicmous前面回复14,21提到的二分或四分法来解决。定位速度实际极快.下面我具体落实一下怎样实际来做这一工作,不再讨论理论根据,有错大家指出。 

2.四分概念:

  四分,就是将幕布的投影四边形分成

                   左上(TL),右上(TR),左下(BL),右下(BR)

四部分. 如下图中, 由1-2-3-4四点组成的四边形被水平线分成上下,被垂直线分成左右,整个四边形就有了TL,TR,BL,BR四部分:    

tony问题_第2张图片

 3.任意四边形如何进行四分? 

 *将四边形的两对对边连起来,它们或者平行,或不平行。如不平行,求其交。

  如上图,因12与34不平行,故可得交点O1; 14与23也不平行,故有交点O2。

 

 *求四边形的两个对角线13,24的交点C;

 

 *通过O1,C作水平线Lh=O1-C, 如无O1,则通过C作12(或34)的平行线,为Lh;

 

 *通过O2,C也作垂直线Lv=O2-C, 如无O2,则通过C作13(或24)的平行线,为Lv;

 

 *Lh和Lv就可将四边形1234划分为四部分。

 

4.四分法如何进行? 

 

 *确定幕布上点P在投影四边形的象限(TL,TR,BL,BR之一)

 

 *将幕布上点P所在象限,定为显示屏对应点P'所在象限;

 

 *将所得象限作为四边形,再作四分,再定为P'在显示屏的象限;

 

 *不断重复,直到显示屏的象限收敛为一个象素为止,就结束.  

 


Top 

35.  回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-24 09:00:45Z  得分:0

  

感谢大家,我越来越看不懂了  :)

等到问题解决,我的程序搞定,就再来散上500分。

我看不懂各位解答,也不知道程序该怎么写。而且程序要求最多在10毫秒就要算出一个坐标,昏啊。

 

Top

 

36.  回复人: zzwu(未名) ( ) 信誉:106  2002-07-24 10:13:28Z  得分:0

 

 写程序要用到一些几何作图,包括连线,求交,判别一点在一线的哪一侧.然后就是组织循环.好像没有更多的事情要作了.

 

我不知道的一个事情是:

 你的幕布是什么样的幕布?

 幕布上的点的位置如何读入到计算机中?

 

我想看看大家(特别是quicmous)对我的方法有无意见和疑问? 如1-2天内没有问题提出,接下来就让我用Delphi来编出此程序.

 


Top

 

 37. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-24 11:13:23Z  得分:0 

 

我只在开始时候进行一次校准,就是给出四个顶点的坐标。然后就是随便在幕布上点,我要快速的把这个点画在计算机屏幕上。

刚才想了一下,可以先求出1024等分幕布上区域的斜率或者距离,然后后来的点到这个数组里面查找自己最接近的位置。这样每次运算的时间大大降低,代价是16K的存储空间。

我想这个数组内容应该是有规律的吧?怎么求出这个规律呢,就能不用这16K了。

实际上从幕布取得值有很多方法啊,红外线、超声波、压感等等,各种方法都有广泛的应用,比如触摸屏、手写板、描图板。

 

 

Top

 

 38. 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-24 16:45:41Z  得分:0 

 

to zzwu(未名) :

  我担心你的计算量仍然很大。一劳永逸的方法是把方程解出来,可计算量也太大。是不是让 tony1978(突击召唤师) 请我们下一次馆子犒劳一下...

 

 

Top

 

 39. 回复人: zzwu(未名) ( ) 信誉:106  2002-07-24 21:00:18Z  得分:20 

 

quicmous(快鼠):

 

   好呀! 到上海来,去附近小摊上每人吃一碗凉粉,这样3个人差不多就是500分,不够的话,我来请客!

 

   言归正传, 你说的,把方程解出来,我想也是办法, 可以一试, 计算量我想不会太大,因为这是'一步到位'了.

 

   用我所讲的办法,编程方便些,需要循环,但总共迭代log2(1024)=10次,如每次作20个乘法,20个加法,应是很快的.

 

   另外,不理解tony1978(突击召唤师)对速度的要求,要知道,幕布上去定点不是人工操作吗,何必需要速度?

 

   还是让我先编个程序出来再说吧.

 

 

Top

 

 40. 回复人: xf8zbf(瞎想) ( ) 信誉:100  2002-07-24 21:51:40Z  得分:0 

 

说只要三个点的笨笨们,你们看那四个点是空间中的三维点吗?

那只是平面上的四个点啊!

 

所以四个点是必须的。

至于是否必须要九个点,我倒是不能一下肯定 

 

Top

 

 41.  回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-24 22:14:06Z  得分:0 

 

to zzwu(未名):

tony1978(突击召唤师)时想做一个类似触摸屏的系统,用户在投影上选择一个点,程序马上就能换算出屏幕坐标。

你是否听说过有一种激光键盘,就是利用激光把键盘的影像投在桌面上,用户的按键动作会反馈到计算机转换成ASCII码。

不过对速度的要求和精度的要求有可能是一种更高级的设备,既然这个最基本的问题都解决不了,干脆放弃项目吧...呵呵!!

 

  

Top

 

 42. 回复人: zzwu(未名) ( ) 信誉:106  2002-07-25 08:56:21Z  得分:0 

 

tony1978(突击召唤师):

 

  我希望你本人来谈谈实际使用的设备,使我能确信考虑速度的必要性.

 

  如果是通过人工点入幕布上点的位置,就根本用不到提任何速度指标. 

 

Top

 

 43. 回复人: zzwu(未名) ( ) 信誉:106  2002-07-25 09:21:55Z  得分:0 

 

tony1978(突击召唤师):

 

    另外,也希望讲讲'越来越看不懂'的具体事情在何处?

 

    说不定其中确实有问题,也就是任何人实际都无法看懂的问题.

 

    如果这一问题存在于我的算法中,我就应改正它,这也就是为什么要大家先看看我的算法的原因.

 

    如果你所看不懂的问题实际不是问题,但存在于我的算法中,我将进行说明.你是最终用户,要心里有底才行.


  

Top

 

 44. 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-25 10:10:17Z  得分:0 

 

为什么我认为三个点就行,三点定一平面,当然行了

而且是点光源才是EASY呢

做一图

  *

 -----

 /    /

------

 -----------

/ *      /

-----------

定光源点为L

定左下角为下面平面Q

上面平面左下角为Q'

给 出了下面一点A

做光源到下面点的直线,交上面平面点A'

做AQ与A'Q'

LQ交上面平面为Q'(这是一定的,也是题义直接就有了)

则LA'Q'与LAQ为确定形

证毕(三点就行)

解:

做过Q'点一平面与下平面平行  阿尔法'

得出A''点,

再用A''点解出A'

可解

 

程序:

自己写写

分数:

你看着给

TO上面朋友,

我还真是笨笨!!

 

 

 

Top

 

 45. 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-25 10:23:51Z  得分:0 

 

对了,考虑到大家把高一的立体几何忘了,

还得写一点,

用A''点解A'点

已知两平面夹解为 伽马

平面上方一点为L

做LA''交另一平面为A'

求A'点

解:

做L到两平面相交线的垂线,垂点为O

做OA''和OA'

在OLA'的平面上解三角形

相当于已知一三角形,从一点做一夹解为 伽马的线交对边为一点X

解X

一题

(已经是平面的问题了)

 

对了,效率么,当然没的说,

你把已知条件都设为变量,解出公式来,

用计算机一算,肯定是慢不了,

不过,你的解的过程(时间做废)

哈哈,是不是有点老板的作风???

 

 

 

Top

 

 46. 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-25 11:14:57Z  得分:0 

 

头一次参与这么热烈的讨论啊,呵呵。

我的设备是每秒扫描50-60次,如果有人在幕布上模拟鼠标拖拽,就要在20毫秒内返回。同时,由于还要更新屏幕、给硬件留出缓冲时间,所以时间就更少了。

zzwu(未名) 的算法,在我的机器(PIV 1.4G 512M)上,大概不到1毫秒,符合要求。可是在最低配置要求下,就很困难了。

我已经三年没看过算法了,所以现在看起来很头疼,程序也不会编了  :)

我的程序框架已经设计好了,估计到9月末开始编码。设备现在还在设计中,据我乐观的估计,是赚不到钱  ft~~~~~

 

 

Top

 

 47. 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-25 11:21:50Z  得分:0 

 

对了,考虑到大家把高一的立体几何忘了,

还得写一点,

用A''点解A'点

已知两平面夹解为 伽马

平面上方一点为L

做LA''交另一平面为A'

求A'点

解:

做L到两平面相交线的垂线,垂点为O

做OA''和OA'

在OLA'的平面上解三角形

相当于已知一三角形,从一点做一夹解为 伽马的线交对边为一点X

解X

一题

(已经是平面的问题了)

 

对了,效率么,当然没的说,

你把已知条件都设为变量,解出公式来,

用计算机一算,肯定是慢不了,

不过,你的解的过程(时间做废)

哈哈,是不是有点老板的作风??? 

 

Top

 

48. 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-25 11:30:28Z  得分:0 

 

纯数学有的时候,是很好用的, 

 

Top

 

 49. 回复人: zzwu(未名) ( ) 信誉:106  2002-07-25 13:08:15Z  得分:0 

 

tony1978(突击召唤师):

 

通过你的解释,我对此问题已有了解,这确是一个创新工作,至少我以前没有看到过,甚至也没有想到过,我认为是一项有意义的课题,赚不到钱也值得做,成功后,可以去申请一个专利麽.

 

到时不要忘了我们大家呀!

 

 

Top

 

 50.回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-25 15:54:03Z  得分:0 

 

tony1978(突击召唤师):

我这两天有点焦头烂额,等我忙完手头的活,如果 zzwu(未名) 等高手还没出手,我就费劲给你一个基于直角坐标系的解,我真心的希望你的发明能挣到钱!

 

 

Top

 

 51.回复人: xf8zbf(瞎想) ( ) 信誉:100  2002-07-25 20:33:20Z  得分:0 

 

(0,1),(0,0),(1,0),(1,1)

 

一 对应(0,1),(0,0),(1,0),(1,1)

 

二 对应(0,1),(0,0),(1,0),(2,2)

 

设两平面平行,高为1

则一为立方体

二为。。。

 

总之可以得到两种形状的物体。

 

 

上下两平面的点可以有一一对应关系呀

 

 

 

Top

 

 52.回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-27 08:43:27Z  得分:0 

tony问题_第3张图片

to zzwu(未名) :

  我发现一个简单解法。方法如下:

  假设原像是矩形 ABCD , 像A'B'C'D'.不失一般性,假设A'B',D'C'相交于M, A'D',B'C'相交于N. 过A作直线L于MN平行.

  如果AB上有均匀(等距)的刻度,则些刻度在A'B'上不再均匀.如果以N点为光源,把 A'B'映射到直线L上,则这些刻度再次变成均匀(等距)的.

   因此,欲确定像平面内任意一点的横坐标,只需要把该点通过光源N映射到直线 L上即可.同理,以M点为光源可以求得纵坐标.

   至于如何根据像点在L上的位置换算成计算机屏幕坐标,方法有很多,例如定比分点或直接采用比例算法等等.

   呵呵,我想我们已经找的了最佳的算法.

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-27 09:31:36Z  得分:20

 

 

 

若假设是线性变换,这里提供一种方法--同素变换法。

同素变换是线性变换之一,但变换前后不保持线段的长度比和平行性,符合空间线性影射关系。

  设原始点为:(x,y)

   投影点为:(X,Y)

  则有

     X=(a1*x+a2*y+a3)/(c1*x+c2*y+c3)

     Y=(b1*x+b2*y+b3)/(c1*x+c2*y+c3)

  可简化为

     X=(a1*x+a2*y+a3)/(x+d2*y+d3)

     Y=(b1*x+b2*y+b3)/(x+d2*y+d3)

  式中  d2=c2/c1, d3=c3/c1

  共8个未知系数(a1,a2,a3,b1,b2,b3,d2,d3),只需4对点的条件,于是不难解出。整屏图形计算系数只需一次,不会影响速度。

 

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-27 12:57:48Z  得分:0

 

 

 

*****上文重写******

 

若假设是线性变换,这里介绍一种方法----同素变换法。

同素变换是线性变换之一,但变换前后不保持线段的长度比和平行性,符合空间线性影射(透视)关系。

  设幕布点为:(x,y)

   屏幕点为:(X,Y)

  则有

     X=(a1*x+a2*y+a3)/(c1*x+c2*y+c3)

     Y=(b1*x+b2*y+b3)/(c1*x+c2*y+c3)

  分子分母同除c1,上式可简化为

     X=(a1*x+a2*y+a3)/(x+c2*y+c3)

     Y=(b1*x+b2*y+b3)/(x+c2*y+c3)

  式中 a1=a1/c1,a2=a2/c1,a3=a3/c1,b1=b1/c1,b2=b2/c1,b3=b3/c1,c2=c2/c1,c3=c3/c1

  共8个未知系数(a1,a2,a3,b1,b2,b3,c2,c3),只需4对已知点的条件(屏幕及幕布图形各四个顶点),于是不难解出8个系数。整屏图形,计算系数只需一次,不会影响速度。

 

 

 

Top

 

 复人: zzwu(未名) ( ) 信誉:106  2002-07-29 09:20:00Z  得分:0

 

 

 

To quicmous(快鼠):

 

  你的最后一个算法十分巧妙! 如果不是联想到视平线,视平面等透视原理,要利用投影几何的基本知识来直接证明算法的正确性还真不容易!

 

  我也同意你的看法:这已经是一个最优方案了,不再可能找到更多的改进余地.

 

  另外,不知你有没有注意到前面Xqr()提出的'同素变换法'? 他和我们走的是两条路,采用了代数方法来实现映射. 但我想(没有具体去算过,我很懒的动笔),如果他的变换法没有问题的话, 他的结果应和你的结果一致, 也就是说,把你的方案综合起来写成表达式,很有可能和他的X,Y的算式完全一样.

 

 

 

To tony1978(突击召唤师):

  我前面提出的那个方案已编写成了一个程序,可以演示.为了方便,采用DOS下640*480的标准VGA图形模式,用pascal语言.由于分辨率低,再加上想在屏幕上画出两个无穷远点,幕布的面积已很小,所以我只迭代6次.

  程序利用到我以前编的一些程序(改编得到),有一大堆无关的东西还在上面,相当乱. 所以源程序要整理干净才能发给你或在这里贴出.

 

 

 

Top

 

 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-29 14:43:04Z  得分:0

 

 

 

To quicmous(快鼠):

绝妙的方法!不过有两条线平行的时候怎么办啊?

 

 

Top

 

 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-07-29 15:45:23Z  得分:0

 

 

 

六元的方程组,怎么解啊。

 

 

Top

 

 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-29 16:07:23Z  得分:0

 

 

 

To zzwu(未名) :

  xqr() 的方法和我以前列出的方程是等价的,难点在于解这个方程组并不容易。新的方案完全变成了平面解析几何问题,计算应该简单一些。

 

to tony1978(突击召唤师) :

A'B'||D'C'时,L||A'B',这个时候A'D方向的坐标(可能是纵坐标)应该采用某种比例算法就可以确定。

 

 

Top

 

 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-29 16:55:17Z  得分:0

 

 

 

quicmous(快鼠)

你的方法真是好,

可惜要两个平面平行才行呀,

这和相似有分别么?

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-29 16:57:43Z  得分:0

 

 

 

同素变换又称共线变换。为求未知系数,须要解8阶的线性方程组,解线性方程组的算法在计算方法一书中早有现成,不管方程组有多少阶,编程代码都一样而且很简练。一旦求出8个系数,计算屏幕坐标则易如反掌。同素变换法的编码具有简洁易读易维护的优点。

quicmous(快鼠)的方法基于透视原理的图解算法,亦很好,但各种判断和特殊处理过程可能较多。

 

 

 

Top

 

 回复人: dearmite(笨笨的我*_^) ( ) 信誉:100  2002-07-29 17:00:36Z  得分:0

 

 

 

quicmous(快鼠)

你没看我的贴子,

你这个方法和我第一步一样,

另,如两平面夹解很小,就统一除以cos(F)

可以说,这样就是你的方法的修正解,

但如楼主要想算,只好把两二步,用几何推一下了(其实不难的,

写起来多,算起来,就那么两下(斜对直,下投影))

 

 

Top

 

 回复人: zzwu(未名) ( ) 信誉:106  2002-07-29 17:36:56Z  得分:0

 

 

 

to tony1978(突击召唤师):

作平行线在投影几何里和过两点连直线是同一概念.搬到欧氏几何中才有本质区别.

具体解决办法就是分别考虑,如和我前面讲的那样.

 

-----------------------------------------------------------------

to dearmite(我是笨笨!):

为什么要两个平面平行才行啊?

 

-----------------------------------------------------------------

to xqr():

我很想稍微再深入了解一点你的同素变换法,不知属于那一数学领域的,以前好像听到过,是代数几何吗?

又:

在我完成了我的算法的同时,也就完成了quicmous(快鼠)算法所需的几个主要子程序,这一算法实现起来实际也并不太复杂.

 

 

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-30 07:50:06Z  得分:0

 

 

 

to zzwu(未名):

 

同素变换又称共线变换,属射影几何范畴,常用于地图图形的几何改正,其它领域应用不多见。其实,同素变换是二维图形空间线性变换的代数形式,可从二维齐次坐标矩阵变换公式(见下式)演变而来。

   (X' Y' H)=(x y 1)T

   式中,T是3*3变换矩阵,最后一列不是(0 0 1),而是任意数(p q s)

   H=px+qy+s

   X=X'/H, Y=Y'/H

 

本人曾参阅下列各书:

1.几何变换  龙泽斌编著,湖南科技出版社,1984

2.空间解析几何引论  南开大学数学系编,人民教育出版社,1978

3.计算机地图制图原理  徐庆荣等编著,武汉测绘科技大学出版社,1993

 

 

 

Top

 

 回复人: zzwu(未名) ( ) 信誉:106  2002-07-30 15:45:25Z  得分:0

 

 

 

 

To xqr(): 很感谢!

 

<射影几何>我手头有一本老的英文书,前几天我正在看,很有趣,也是受它的启发,提出了前面那个算法. 这本书的缺点是不讲变换的,看不到一个矩阵,都用1-1对应和几何图形来说明问题.

 

南开的<空间解析几何引论>正好自己有,但一下子没有找到上册. 在下册有个'射影几何简介',粗翻了一下没有找到,准备再细心点看一看.

 

<计算机地图制图原理>则完全没有了,只得明天去图书馆找了.

 

再次谢谢你了.   

 

 

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-30 17:43:45Z  得分:0

 

 

 

to zzwu(未名):

 

谈谈我的认识。

1.在有关射影几何的书中可能找不到“同素变换”或“共线变换”的名词,但是这种变换方法或思想是有的。在《几何变换》的“几何变换的矩阵方法”一章中对此法谈得多些具体些。所谓“同素变换”或“共线变换”的称法我猜测可能是地图学界给它起的。

2.实际上,同素变换是将位于z=0平面上的图形变换至z=1的平面上,并保持线性关系。其变换过程似中心(透视)投影,但变换前后两图形平面总是平行的,故不同于一般的中心投影。其次,变换前后图形线段不具有等比性和平行性,故又不同于仿射变换。

3.鉴于上述,在纯中心(透视)投影条件下,采用同素变换只是一种近似处理。

 

以上浅见,请指正。

 

 

 

Top

 

 回复人:quicmous(快鼠) ( ) 信誉:99  2002-07-30 20:31:18Z  得分:0

 

 

 

to zzwu(未名):

 xqr() 提供的变换与我前面给出的变换是等价的。都是先把z=0平面上的图像经过一个线性变换变到一个三维空间的中间位置,然后把该图形映射到z=1平面上。不同之处是,xqr()直接略去了z和z'坐标,方程显得更为简练。

 

以下选自我在楼上法的帖子,可以和xqr的防城进行比较:

...

我给出的变换包含两个基本变换:

第一步:把位于xy平面上的屏幕坐标经过仿射变换转换到三维坐标系。这个变换本身包含平移、旋转等几何变换。

第二步:以三维坐标原点为光源的投影变换,投影平面是z=1,公式如下P(x,y,z)->p'(x',y',z')

   x'= x/z

   y'= y/z

...

x'=(a11*x+a12*y+a13*z+a14)/(a31*x+a32*y+a33*z+a34)

y'=(a21*x+a22*y+a23*z+a24)/(a31*x+a32*y+a33*z+a34)

...

断定原像平面和像平面平行,其实是误解,因为原像到像的变换是一个线性变换和摄影变换构成的复合变换。首先原像经过一个线性变换得到位置可能很“别扭”的中间像,中间像再投影到z=1平面上。正如你能看到的,我在楼上帖子里的方程式是非线性的(射影变换)。

...

 

计算机算法手册确实给出了解线性方程组的一般方法,问题是如果对于每一个点都要采用复杂的消元法求解,效率会成问题。因此问题的关键在于每个点坐标变换的计算效率。

 

 

Top

 

 回复人: zzwu(未名) ( ) 信誉:106  2002-07-31 10:03:42Z  得分:0

 

 

 

上面两位: 谢谢帮助!

   我也深信,无论我们用什么方法,只要都能正确解决问题,那么所作的变换一定都是同一种变换!

   我所好奇的,是'同素变换'这个术语,以前没有听到过,所以想了解一下起来源.是从哪一实际应用领域提出来的?

   昨晚我碰到一位一生从事几何研究的几何教研组的老师,问起'同素变换'的问题. 他也说没有听到过,并'估计不会是一个数学术语',并且,正如xqr()所预料那样,'可能来自地图学界的'.

 

 

 

 

 

Top

 

 回复人: zzwu(未名) ( ) 信誉:106  2002-07-31 10:44:03Z  得分:0

 

 

 

to xqr():

 

关于原像平面和像平面平行的问题,我也同意quicmous(快鼠)的看法,认为不需要.

 

因为,我想,如果原像平面和像平面平行,则幕布上的图像也就不会被弄成任意四边形了.

 

 

 

 

Top

 

 回复人: xqr(星球人) ( ) 信誉:100  2002-07-31 13:06:48Z  得分:0

 

 

 

to zzwu(未名)

to quicmous(快鼠)

 

再噜囌几句。

同素变换的矩阵表达式为:

  (X' Y' H)=(x y 1)T

  H=px+qy+s

  X=X'/H, Y=Y'/H

  式中,T是3*3变换矩阵,第1,2列的作用是仿射变换(比例,对称,错移,旋转,平移等),最后一列(p q s)的作用是中心透影变换和全图比例变换。

  分解上式的过程:

  1.将xoy平面上的图形平移至z=1的平面,即(x y 0)->(x y 1)   

  2.将z=1平面上的图形(z y 1)仿射变换至H=px+qy+s的平面上,即

     (x y 1)->(X' Y' H)  

  3.以坐标原点为透视中心,对H=px+qy+s平面上的图形点(X' Y' H)作射线,并用z=1的平面截取得z=1平面上新图像,即(X' Y' H)->(X'/H  Y'/H 1)=(X Y 1),X和Y便是我们所需要的。

  可见

  1.上述结果图像平面与原图像平面的平行,只是为了公式推导的图解映射关系,并不代表两图像平面的真实关系。注意,它与两个平行平面间的中心投影变换不同,它不保持等比和平行性,成像仍可能为任意四变形,在实际应用中也不要求两个像平面要平行才能采用同素变换。

  2.同素变换是仿射变换和中心变换的复合变换。

 

--------------------------------------------------------------------

to quicmous(快鼠)

 

按同素变换,整屏图形,计算系数(8个)只需一次(因为全图是同一种变换),不须每图形点都要重新算一次系数。在求得系数(a1,a2,a3,b1,b2,b3,c2,c3)后,每个图形点的计算量甚小,如下式

   X=(a1*x+a2*y+a3)/(x+c2*y+c3)

   Y=(b1*x+b2*y+b3)/(x+c2*y+c3)

 

 

 

 

Top

 

 回复人: quicmous(快鼠) ( ) 信誉:99  2002-07-31 16:27:29Z  得分:0

 

 

 

to xqr() :

 8个系数只需一次计算,同意你的说法。

 

 

Top

 

 回复人: zzwu(未名) ( ) 信誉:106  2002-07-31 17:46:06Z  得分:0

 

 

 

to 大家:

   

   这样好像都能统一了!

 

   我的演示程序也可以了,如有兴趣看,我发给大家.

 

 

   确实非常快非常快,6次乘,2次除,再是几次加,就整个完了!

 

 

 

 

Top

 

人: xqr(星球人) ( ) 信誉:100  2002-08-01 06:11:28Z  得分:0

 

 

 

to zzwu(未名)

to quicmous(快鼠)

十分感谢你们对我的许多启示。

我们提出的具体解决办法虽有些不同,但思路和基本原理是一致的。

 

 

Top

 

 回复人: hanqiong1(瀚琼) ( ) 信誉:97  2002-08-05 13:32:04Z  得分:0

 

 

 

不知诸位是否做过从一张图片上识别一维条形码的程序或算法。我急切需要。

联系方式:

[email protected]

 

 

Top

 

 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-08-23 16:29:05Z  得分:0

 

 

 

结贴,FAQ之

 

 

Top

 

 回复人: tony1978(突击召唤师) ( ) 信誉:100  2002-08-23 18:01:50Z  得分:0

 

 

 

上个论坛,比上火星都慢

 

 

Top

 

 

 

该问题已经结贴 ,得分记录:

 eion (5)、 quicmous (20)、 eion (20)、 jojoship (5)、 zzwu (20)、 dearmite (10)、 xqr (20)、 

 

 

 

 

 回复人: xqr(星球人) 


tony问题_第4张图片

你可能感兴趣的:(tony问题,透视对应)