Board logo

标题: 求助一个数学问题 [打印本页]

作者: was_denn_los?    时间: 2012-5-27 23:26     标题: 求助一个数学问题

本帖最后由 was_denn_los? 于 2012-5-28 11:19 编辑

一个边长为2/3的等边三角形,由四个边长均为1/3的等边三角形组成(编号1,2,3,4)。一任意vector,其模长和角度a已知(见附图),有什么简单的方法(或适合编程的方法,因最终要编程实现)确定vertor v 的终点(箭头处)位于哪个小等边三角形(1,2,3,4)内呢?
****************************************************
问题应该算是解决了,特别感谢14楼和16楼提供的思路,14楼提到的方法很不错,我还查了一下,还有面积法,重心法什么的(我这编程底子浅的就想学习一下编程功底深的都用什么方法去解决这类问题)。16楼提供的思路对本问题应该是最有效的。
我还在研究能不能用14楼提到的叉积法去实现16提到的判断点在线段哪边。
再次谢谢各位参与讨论,提供帮助,提供新思路!
3eck1.png

图片附件: 3eck1.png (2012-5-28 10:17, 22.35 KB) / 下载次数 0
http://csuchen.de/bbs/attachment.php?aid=445292&k=cd3d154514af207544340a008bfdc72b&t=1727608972&sid=TQtT08


作者: 朴实无华    时间: 2012-5-27 23:47

有意思。。抛砖引玉吧,我猜用中学的线性规划?

先把终点坐标确定,然后把坐标代入所有边的直线方程。。看点究竟处在边的上边还是下边(左边或者右边)
作者: 爱满人间    时间: 2012-5-27 23:52

本帖最后由 爱满人间 于 2012-5-28 00:55 编辑

对于固定的模长v,落在三角形2中的情况的alpha的允许范围是可以轻易表达出来的(alpha(v)的函数表达出来),如果alpha落在这个区域里那自然就满足条件了。
你把原点和234三个三角形的那个交点(右上那个点)链接起来不难得到一个等式:
cos(alpha/2)*v+sin(alpha/2)*v*(3^0.5)=1/(3^0.5)
你可以用万能公式也可以用和差化积也可以直接合并起来,对付这东西的办法非常多,当然程序更容易实现
然后发挥你的编程才能把~这东西还是非常简单的。。。
作者: 朴实无华    时间: 2012-5-28 00:02

具体一下,
1.先比较大三角形的左腰、右腰和x轴,看看点究竟落不落在大三角形区域内(若题设已经说明点一定落在这个区域,则此步省略。。)
2.比较三角形2上侧水平边,在上侧则落在三角形4内,下侧则继续判断
3.同2,比较三角形1右腰。。
4.同2、3,比较三角形3左腰。。

我的想法。。不知道是不是露怯了,,抛砖引玉抛砖引玉。。
作者: 朴实无华    时间: 2012-5-28 00:05

3楼,碉堡了。。
作者: was_denn_los?    时间: 2012-5-28 00:17

回复 3# 爱满人间
谢谢你的回复。
这种方法我考虑过,也考虑过通过v*cos(a)和v*sin(a)来确定v的位置,但老感觉有点复杂(我编程就半桶水:) ,而且这部分也只是我程序的一小部分,所以想尽可能简单点)
作者: Darkpriest    时间: 2012-5-28 00:23

没有任何计算的猜想...是不是比较下到各个顶点的距离之和就可以判断是在哪个三角形里?
作者: was_denn_los?    时间: 2012-5-28 00:24

回复 4# 朴实无华
谢谢回复,这跟我通过v*cos(a)和v*sin(a)来确定v的位置想法基本一致,步骤1可省略,2比较容易,就是觉得2,3有点麻烦(可能受限于本人拙 劣的编程水平吧
作者: was_denn_los?    时间: 2012-5-28 00:26

回复 7# Darkpriest
这个听上去好哦!!好像比较容易实现!我再想一下,先谢谢了!!!
作者: 朴实无华    时间: 2012-5-28 00:27

回复 8# was_denn_los?

每步一个if语句就能解决了。。
作者: was_denn_los?    时间: 2012-5-28 00:30

回复 10# 朴实无华
是的谢谢,但7楼的方法看上去好像也不错,我在想想看,谢谢哦
作者: jiejiedog    时间: 2012-5-28 00:46

Space Vector Modulation
作者: was_denn_los?    时间: 2012-5-28 00:54

本帖最后由 was_denn_los? 于 2012-5-28 02:00 编辑

回复 12# jiejiedog
大侠既然看透了能支一下招吗? 诚心请教。
作者: sagood    时间: 2012-5-28 01:04

本帖最后由 sagood 于 2012-5-28 02:09 编辑
回复  jiejiedog
大侠既然看透了能支一下招吗? 诚心请教。
was_denn_los? 发表于 2012-5-28 01:54



    可以把问题简化成确定一个点是否在三角形内。
    点在内的话,那么一定在各个边的左边(逆时针方向看的话)。
    而判断点是否则一条射线的左边,可以通过向量叉积的正负来判断。。

                                 A
                                 D
                            B        C

      那么 P(A,B,D) >= 0 && P(B,C,D)  >=0 && P(C, A, D) >=0
      P(m, n, p) = (n.x - m.x) * (p.y - m.y) - (p.x - m.x) * (n.y - m.y)
作者: was_denn_los?    时间: 2012-5-28 01:23

可以把问题简化成确定一个点是否在三角形内。
    点在内的话,那么一定在各个边的左边(逆时针 ...
sagood 发表于 2012-5-28 02:04

又一个大侠出现
老实讲,我发此贴就是期待这样的答案(请上面提供过帮助的同学不要见怪,实在没有冒犯的意思,只是sagood的思路是在让人眼前一亮,大家一起学习学习哦
再次感谢提供这么好的思路,我再研究一下,希望大侠能继续提供意见帮助!
作者: boom    时间: 2012-5-28 07:45

直接编个程序 判断落点位于2号三角形三条边的哪一侧 就可以判断出位于那个区了吧
作者: was_denn_los?    时间: 2012-5-28 09:42

回复 16# boom
听上去就是这样哦,可惜本人编程功底浅,不知道如何下手,得14楼指点才算开窍
如果大侠能详细指点不胜感激!
作者: was_denn_los?    时间: 2012-5-28 10:07

本帖最后由 was_denn_los? 于 2012-5-28 11:09 编辑
直接编个程序 判断落点位于2号三角形三条边的哪一侧 就可以判断出位于那个区了吧
boom 发表于 2012-5-28 08:45
研究了一下,这方法应该是最简单快捷的,谢谢了
只要编几行程序,分别判断点在线段AB,BC,CA的左侧还是右侧就好
再次感谢楼上各位提供不同的思路,谢谢各位帮忙 3eck1.png

图片附件: 3eck1.png (2012-5-28 10:08, 22.35 KB) / 下载次数 1
http://csuchen.de/bbs/attachment.php?aid=445291&k=b2afcc54245780d6476b7d6b2b6aea62&t=1727608972&sid=TQtT08


作者: bachzhang    时间: 2012-5-28 12:02

可以把问题换算到baryzentrische Koordinaten后再判断。 应该在三角坐标系中会简单不少
作者: 爱满人间    时间: 2012-5-28 12:08

本来是想说你可以用三个角都是钝角来解这个问题,但是你极坐标建在那边。。。。。。
作者: newbear    时间: 2012-5-29 15:03

本帖最后由 newbear 于 2012-5-29 16:30 编辑

是不是也可以这么算,
1,计算点“V”到六个顶点的距离
2,对大等边三角形的三个顶点,取离“V”最近的顶点极其对角点(排除另外两个顶点的三角形),做第二次距离比较。就可以判断落点了。

举例来说,对三个大顶点,“V”距离“O”点最近,取“O”点和"B"点,比较到“V”的距离,“V”离“B”近,于是落点在以“B”为顶点的三角形。

简单的理解就是,当“V”到某顶点的距离比到对边三个点的距离都小时,以这个点为顶点的三角形是落点所在的三角形。当“V”到某顶点的距离只比到对边两个端点的距离小,而比到对边中点距离大时,中间的三角形就是落点所在的三角形。
作者: was_denn_los?    时间: 2012-5-29 15:59

是不是也可以这么算,
1,计算点“V”到六个顶点的距离
2,对大等边三角形的三个顶点,取离“V”最近的顶 ...
newbear 发表于 2012-5-29 16:03

谢谢你提供的思路。
我查了一下,其实这问题在计算机图形处理技术里是很普通的问题,只是本人编程底子太薄,刚开始不明就里罢了。
经过研究我还是比较偏向通过叉积判断点在线段左侧或右侧的方法,这样最多只要比较3次就可以确定v落在哪个小等边三角形里了(如果再加上角度判断则最多只要2次就行了)
谢谢




欢迎光临 人在德国 社区 (http://csuchen.de/bbs/) Powered by Discuz! 7.2