给定三个点的坐标,在palm 上画出三角形,请问如何为这个三角形填充颜色。100分求救!

mfmmfc 2005-05-17 02:18:36
如题!
...全文
947 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Badistuta 2005-06-03
  • 打赏
  • 举报
回复
好贴!收藏。。。
Jamestan 2005-06-02
  • 打赏
  • 举报
回复
呵呵,我和sinon都考虑到了效能的问题,所以你用方程的解法老实说会更加耗时间吧?

sinon的算法是先求出三个边的点位,然后画水平线,这是最快的算法,唯一的麻烦就是要算3个边的点位,这样写程序有点复杂,但这是正解。

我的做法主要是为了写程序方便,只要求出一条边的点位然后交给底层API划线,效能确实不高,好在palm的屏幕坐标范围不大,所以执行起来感觉不到。
mfmmfc 2005-06-01
  • 打赏
  • 举报
回复
感谢 sinon 和 Jamestan的大力支持,很受启发
本人也想出一个方法,希望多提意见。
三角形的每条边在直角坐标系里都有一个方程式
f(x,y)=0;如果某个点不在这条边上,把该点的坐标代入方程式,
则f(x,y)>0 或 f(x,y)<0. 这与在直线的那一侧有关。
我的算法可能更为耗时,是这样的,
设三个点的坐标为A(ax,ay) B(bx,by) C(cx,cy)
BC 边的直线方程 f()=0;
AC .............g()=0;
AB h()=0;

取 lx=min(ax,bx,cx) rx=max(ax,bx,cx)
uy=min(ay,by,cy) dy=max(ay,by,cy)

遍历矩形(lx,uy,rx,ry)中的点(x,y)
如果 (f(ax,ay)*f(x,y)>0)&&(g(bx,by)*g(x,y)>0)&&(h(cx,cy)*h(x,y)>0)
那说明 (x,y) 在三角形内部
sinon 2005-05-30
  • 打赏
  • 举报
回复
呵呵,我的填充算法是8、9年前看到的一个算法启发的,具体我自己也没有用过,不是最优的是肯定的。

我也没有具体计算过时间。算法最消耗时间的运算在于计算三条斜边上所有点的坐标,一般可以使用类似breshenham画线算法来计算,其好处是不需要作三角运算,只需要少量加减和乘除运算,效率相当高。如果内存空间允许,可以把所有斜边的点记录下来,那么breshenham的运算也就三次。

另外算法中强调的是画水平线段,因为这是所有类型的线段中效率最高的画法,直接用MemMove之类的操作就可以实现了。

假设画水平线段耗时为M个单位,计算三条斜边上所有点的坐标的操作耗时N个单位,那么填充一个有L条水平线段的三角形,其耗时应该是3N+LM,由于可以肯定N远大于M,所以当L很小的情况下,算法的效率为O(N)。

从楼主的提问看来,比较注重功能的可行性,而没有时间和空间方面的要求。我的算法因为适用任何形状的三角形,所以逻辑简单统一,实现难度低。不过在时间和空间方面没有多少优化。


像这样的问题,还是建议到图形图像版看看,毕竟那里专攻这些的人多,见识也比我广。
Jamestan 2005-05-29
  • 打赏
  • 举报
回复
好久没来csdn了,这个问题我刚好3年前碰到过。

sinon的方法不是最好的解决方案,计算量过大。

我当时的解法是这样的:

1、找出三个点坐标值有在同一零边平行线上的,另外一点作为固定点,沿着平行线点逐点划直线。比如sinon给的样数A(0,0),B(100,0),C(0,100),这个最好办,两两分别有坐标点与(0,0)零边在同一平行线上,这样选择A,B两点直线作为变化线,C点为固定,花线A'(1,0)-C(0,100),A''(2,0)-C(0,100)......B(100,0)-C(0,100);
2、如果三个点没有与零边在同一平行线上,这固定其中一点C,然后计算另外两点的A,B坐标差,通过除数和取模运算确定偏移量,在模拟直线上移动点与固定点之间划直线。模拟直线上的偏移算法举例说明例如:A(0,0),B(10,125),C(60,60),固定C(60,60)点,计算出A,B两点的X,Y方向偏移量分别是+10,+125(负数作为x,y坐标增减的方向),先判断两个方向的偏移量是否一致,一致的话每次变化的偏移量就是各1,否则偏移量大的数作为除数计算出125/10=12,125%10=5,10/5=2无余数(有余数也忽略掉),好了,现在开始,从A(0,0)-C(60,60)划直线,根据上面的结果,y坐标每增加12次,x坐标加一,x坐标每增加2次,y坐标须要补充1次(12+1),逐渐接近B点,最后划出B-C直线,完成填充。

我的方法不是最好的,但是勉强可行,画出来的三角形视觉上看起来还算直边。
bear1977 2005-05-28
  • 打赏
  • 举报
回复
Gc好像是OS 6提供的
sinon 2005-05-22
  • 打赏
  • 举报
回复
OS6以前的API没有这个功能,OS6就不清楚了。

一种做法是计算三角形中两边之间的水平横线段的两个端点,用指定颜色画横线。按照这个逻辑把所有线段都画一次,三角形就填充的。

以一个简单例子说明:

假设一个直角三角形的三个顶点分别为(0,0)、(100,0)、(0,100)。那么就可以分别画线段
(0,1)-(99,1)
(0,2)-(98,2)
......
(0,99)-(1,99)

这样整个三角形就被填充完了。另外你也可以看一些2D图形学的资料,应该有不少这方面的算法。
Badistuta 2005-05-20
  • 打赏
  • 举报
回复
好像Palm OS提供Gc(Graphics API),你可以找找试试

3,119

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧