烦心事~~java

solomonboz 2011-04-19 03:09:47
开门见山,将问题描述如下:
程序中要判断点在三角形内,我是用的面积法写的程序,假设三角形ABC和平面一点P,三角形ABC面积为S,P和三角形ABC任意两个顶点组成的3个三角形的面积分别为S1、S2、S3
程序 if(S==S1+S2+S3){
。。。。。。。。。;
。。。。。。。。。;
}
问题是S、S1、S2、S3是带有小数位的foloat基本数据类型,本应该是三角形内的点P也被判断成不满足等式了,导致if语句块无法执行,请问这种情况怎样处理!
...全文
190 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2011-04-20
  • 打赏
  • 举报
回复
关键在于点在三个内角的内部,而对于每个角都应当利用角度范围.这个有点复杂,(特别是循环角度例如0°和360°边界处)
OnEstepEnD 2011-04-19
  • 打赏
  • 举报
回复
同意6楼,用误差控制来代替。另外求一下2楼的矢量叉乘写的详细解决方案,谢谢了
24K純帥 2011-04-19
  • 打赏
  • 举报
回复
LZ可以把等号换成Math.abs(S-S1-S2-S3)<0.001之类的
ethenjean 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keeya0416 的回复:]
用矢量叉乘来判断
如果 P 点在三角形内部
那么从三角形的3顶点 A、B、C 到P 的矢量与边乘积都是大于 0 的
AP * AB > 0
BP * BC > 0
CP * CA > 0
[/Quote]
同意,这应该是常用方法
ak47zhoujun123 2011-04-19
  • 打赏
  • 举报
回复
BigDecimal 使用这个类可以避免浮点数精度丢失,内含浮点书计算方法,不知道你的这种面积判定方法是不是否严谨,感觉keeya0416 的矢量算法可能会更好

BigDecimal 类的计算方法:
Add max(addend.scale(), augend.scale())
Subtract max(minuend.scale(), subtrahend.scale())
Multiply multiplier.scale() + multiplicand.scale()
Divide dividend.scale() - divisor.scale()

solomonboz 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wula0010 的回复:]
首先,float的精度不够,应该用double,其次,你这个判断方法准确么?这个仅仅是理论上的值,在计算三角形的面积的时候,你得到的一定是准确的,保证没有四舍五入?如果有,就会有精度损失,.........
[/Quote]
是有精度损失,所以闹心!
keeya0416 2011-04-19
  • 打赏
  • 举报
回复
用矢量叉乘来判断
如果 P 点在三角形内部
那么从三角形的3顶点 A、B、C 到P 的矢量与边乘积都是大于 0 的
AP * AB > 0
BP * BC > 0
CP * CA > 0
wula0010 2011-04-19
  • 打赏
  • 举报
回复
首先,float的精度不够,应该用double,其次,你这个判断方法准确么?这个仅仅是理论上的值,在计算三角形的面积的时候,你得到的一定是准确的,保证没有四舍五入?如果有,就会有精度损失,.........

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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