社区
Symbian
帖子详情
给定三个点的坐标,在palm 上画出三角形,请问如何为这个三角形填充颜色。100分求救!
mfmmfc
2005-05-17 02:18:36
如题!
...全文
947
8
打赏
收藏
给定三个点的坐标,在palm 上画出三角形,请问如何为这个三角形填充颜色。100分求救!
如题!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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),你可以找找试试
已知
三角形
三个
顶
点
坐标
如何求解
三角形
面积?
已知
三角形
三个
顶
点
坐标
求解
三角形
面积
判断一个
点
是否在
三角形
内部
题目:在二维
坐标
系中,所有的值都是double型,那么一个
三角形
可以由
三个
点
来代表,
给定
三个
点
代表的
三角形
,再
给定
一个
点
(x, y),判断(x, y)是否在
三角形
中 基本思路: 如果一个
点
O在
三角形
的内部,那么从
三角形
的一个
点
出
发,逆时针走过所有边的过程中,
点
O始终在走过边的左边。如果
点
O在外侧,则不满足这一条件。 如果要逆时针走过一遍
三角形
,那么
三个
点
的位置是重要的,假设输入的
三个
点
依...
Python | 输入
三角形
三个
顶
点
的
坐标
,若有效则计算
三角形
的面积;如
坐标
无效,则给
出
提示
import math def isvalid(a=0.0, b=0.0, c=0.0): """判断三条边长是否符合
三角形
的定义:任意两边之和大于第三边,任意两边之差小于第三边""" side = [a, b, c] side.sort() if side[0] + side[1] > side[2] and side[2] - side[1] < side[0]: return True else: return F
其他题目---判断一个
点
是否在
三角形
内部
【题目】 在二维
坐标
系中,所有的值都是double型,那么一个
三角形
可以由
三个
点
来代表,
给定
三个
点
代表的
三角形
,再
给定
一个
点
(x, y),判断(x, y)是否在
三角形
中。【基本思路】 方法一。 等面积法。如果一个
点
在
三角形
内部,那么以该
点
为顶的
三个
小
三角形
的面积和应该等于大
三角形
的面积。如果这个
点
在
三角形
的外部,那么
三个
小
三角形
的面积和要大于大
三角形
的面积。知道
三个
点
,如何求该
三个
点
为顶
点
判断是否构成
三角形
给定
平面上任意
三个
点
的
坐标
(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成
三角形
。 解体思路:构成
三角形
的要求是,两边之和大于第三条边,读者根据这个准则判定即可。 C语言源代码演示: #include<stdio.h>//头文件 #include<math.h>//为了引用sqrt函数 intmain()//主函数 { doublex1,y1,x2,y2,x3,y3;//定义变量 floatside_Length1,side...
Symbian
3,119
社区成员
9,182
社区内容
发帖
与我相关
我的任务
Symbian
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
复制链接
扫一扫
分享
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章