小朱的Cplusplus博客
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
9 随笔 :: 0 文章 :: 7 评论 :: 0 Trackbacks
<
2011年7月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
(15)
C++(5)
(rss)
WildMagic(2)
(rss)
个人心情(1)
(rss)
个人作品(6)
(rss)
计算机图形学(1)
(rss)
算法学习笔记
(rss)
随笔档案
(9)
2011年7月 (1)
2010年11月 (5)
2010年10月 (3)
搜索
最新评论
1. re: 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)
大神,可以把源码也发我一份吗?学习一下,490294426@qq.com。谢谢啦!
--Lorraine
2. re: 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)
120453331@qq.com 如果可以的话你把你的作品都发我吧,我想多研究下别人的作品,谢谢大哥。
--晓辉
3. re: 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)
120453331@qq.com 发我一份研究研究吧,谢谢你。
--晓辉
4. re: 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)[未登录]
用D3D做出来这效果对咱们学生来说很不易啊
哥们儿 我服你
我现在也在学习D3D 给我发过来膜拜一下吧
nqweizhilian@gmail.com谢谢了啊!
--micky
5. re: 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)
我也想学习一下,发到我的邮箱aigo@mail.com好吗!谢谢!
-- 玄冬
阅读排行榜
1. 【个人作品】OpenGL场景展示 (完成时间:大二下学期)(1006)
2. 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)(795)
3. 【2010-10-19】【计算机图形学】【WildMaigc】 求解 点到三角形的距离(761)
4. 【个人作品】音乐播放器 (完成时间:大三下学期)(407)
5. 【个人作品】 变形 俄罗斯方块 (完成时间:大二上学期)(360)
评论排行榜
1. 【个人作品】 Direct3D 场景展示(完成日期:大三下学期)(7)
2. 【个人作品】 毕业设计做的编辑器(0)
3. 【2010-10-17】【个人心情】庆祝开通个人C++博客(0)
4. 【2010-10-17】【WildMagic】C++ 中DLL导出(0)
5. 【2010-10-19】【计算机图形学】【WildMaigc】 求解 点到三角形的距离(0)
【2010-10-19】【计算机图形学】【WildMaigc】 求解 点到三角形的距离
三角形参数公式及点到直线的参数公式:
计算点到直线的距离可以把点和三角形的相对区域分为的7块。
伪代码:
WildMagic 中的实现:
PxTriangle2.hpp
1
#ifndef _PXTRIANGLE2_HPP_
2
#define
_PXTRIANGLE2_HPP_
3
4
#include
"
PxFounadtionLIB.hpp
"
5
#include
"
PxVector2.hpp
"
6
7
namespace
PX
8
{
9
/**/
///
二维三角形
10
template
<
class
Real
>
11
class
Triangle2
12
{
13
public
:
14
//
构造函数
15
Triangle2 ();
16
Triangle2 (
const
Vector2
<
Real
>&
rkV0,
const
Vector2
<
Real
>&
rkV1,
17
const
Vector2
<
Real
>&
rkV2);
18
Triangle2 (
const
Vector2
<
Real
>
akV[
3
]);
19
20
//
点到三角形的距离
21
Real DistanceTo (
const
Vector2
<
Real
>&
rkQ)
const
;
22
23
Vector2
<
Real
>
V[
3
];
24
}
;
25
26
#include
"
PxTriangle2.inl
"
27
28
typedef Triangle2
<
float
>
Triangle2f;
29
typedef Triangle2
<
double
>
Triangle2d;
30
31
}
32
#endif
//
_PXTRIANGLE2_HPP_
PxTriangle2.inl
1
/**/
/*
2
*
3
* 文件名称 : PxTriangle2.inl
4
*
5
*/
6
//
----------------------------------------------------------------------------
7
template
<
class
Real
>
8
Triangle2
<
Real
>
::Triangle2 ()
9
{
10
}
11
//
----------------------------------------------------------------------------
12
template
<
class
Real
>
13
Triangle2
<
Real
>
::Triangle2 (
const
Vector2
<
Real
>&
rkV0,
14
const
Vector2
<
Real
>&
rkV1,
const
Vector2
<
Real
>&
rkV2)
15
{
16
V[
0
]
=
rkV0;
17
V[
1
]
=
rkV1;
18
V[
2
]
=
rkV2;
19
}
20
//
----------------------------------------------------------------------------
21
template
<
class
Real
>
22
Triangle2
<
Real
>
::Triangle2 (
const
Vector2
<
Real
>
akV[
3
])
23
{
24
for
(
int
i
=
0
; i
<
3
; i
++
)
25
{
26
V[i]
=
akV[i];
27
}
28
}
29
//
----------------------------------------------------------------------------
30
template
<
class
Real
>
31
Real Triangle2
<
Real
>
::DistanceTo (
const
Vector2
<
Real
>&
rkQ)
const
32
{
33
Vector2
<
Real
>
kDiff
=
V[
0
]
-
rkQ;
34
Vector2
<
Real
>
kE0
=
V[
1
]
-
V[
0
], kE1
=
V[
2
]
-
V[
0
];
35
Real fA00
=
kE0.SquaredLength();
36
Real fA01
=
kE0.Dot(kE1);
37
Real fA11
=
kE1.SquaredLength();
38
Real fB0
=
kDiff.Dot(kE0);
39
Real fB1
=
kDiff.Dot(kE1);
40
Real fC
=
kDiff.SquaredLength();
41
Real fDet
=
Math
<
Real
>
::FAbs(fA00
*
fA11
-
fA01
*
fA01);
42
Real fS
=
fA01
*
fB1
-
fA11
*
fB0;
43
Real fT
=
fA01
*
fB0
-
fA00
*
fB1;
44
Real fSqrDist;
45
46
if
(fS
+
fT
<=
fDet)
47
{
48
if
(fS
<
(Real)
0.0
)
49
{
50
if
(fT
<
(Real)
0.0
)
//
region 4
51
{
52
if
(fB0
<
(Real)
0.0
)
53
{
54
if
(
-
fB0
>=
fA00)
55
{
56
fSqrDist
=
fA00
+
((Real)
2.0
)
*
fB0
+
fC;
57
}
58
else
59
{
60
fSqrDist
=
fC
-
fB0
*
fB0
/
fA00;
61
}
62
}
63
else
64
{
65
if
(fB1
>=
(Real)
0.0
)
66
{
67
fSqrDist
=
fC;
68
}
69
else
if
(
-
fB1
>=
fA11)
70
{
71
fSqrDist
=
fA11
+
((Real)
2.0
)
*
fB1
+
fC;
72
}
73
else
74
{
75
fSqrDist
=
fC
-
fB1
*
fB1
/
fA11;
76
}
77
}
78
}
79
else
//
region 3
80
{
81
if
(fB1
>=
(Real)
0.0
)
82
{
83
fSqrDist
=
fC;
84
}
85
else
if
(
-
fB1
>=
fA11)
86
{
87
fSqrDist
=
fA11
+
((Real)
2.0
)
*
fB1
+
fC;
88
}
89
else
90
{
91
fSqrDist
=
fC
-
fB1
*
fB1
/
fA11;
92
}
93
}
94
}
95
else
if
(fT
<
(Real)
0.0
)
//
region 5
96
{
97
if
(fB0
>=
(Real)
0.0
)
98
{
99
fSqrDist
=
fC;
100
}
101
else
if
(
-
fB0
>=
fA00)
102
{
103
fSqrDist
=
fA00
+
((Real)
2.0
)
*
fB0
+
fC;
104
}
105
else
106
{
107
fSqrDist
=
fB0
*
fS
+
fC
-
fB0
*
fB0
/
fA00;
108
}
109
}
110
else
//
region 0
111
{
112
//
minimum at interior point
113
Real fInvDet
=
((Real)
1.0
)
/
fDet;
114
fS
*=
fInvDet;
115
fT
*=
fInvDet;
116
fSqrDist
=
fS
*
(fA00
*
fS
+
fA01
*
fT
+
((Real)
2.0
)
*
fB0)
+
117
fT
*
(fA01
*
fS
+
fA11
*
fT
+
((Real)
2.0
)
*
fB1)
+
fC;
118
}
119
}
120
else
121
{
122
Real fTmp0, fTmp1, fNumer, fDenom;
123
124
if
(fS
<
(Real)
0.0
)
//
region 2
125
{
126
fTmp0
=
fA01
+
fB0;
127
fTmp1
=
fA11
+
fB1;
128
if
(fTmp1
>
fTmp0)
129
{
130
fNumer
=
fTmp1
-
fTmp0;
131
fDenom
=
fA00
-
2.0f
*
fA01
+
fA11;
132
if
(fNumer
>=
fDenom)
133
{
134
fSqrDist
=
fA00
+
((Real)
2.0
)
*
fB0
+
fC;
135
}
136
else
137
{
138
fS
=
fNumer
/
fDenom;
139
fT
=
(Real)
1.0
-
fS;
140
fSqrDist
=
fS
*
(fA00
*
fS
+
fA01
*
fT
+
2.0f
*
fB0)
+
141
fT
*
(fA01
*
fS
+
fA11
*
fT
+
((Real)
2.0
)
*
fB1)
+
fC;
142
}
143
}
144
else
145
{
146
if
(fTmp1
<=
(Real)
0.0
)
147
{
148
fSqrDist
=
fA11
+
((Real)
2.0
)
*
fB1
+
fC;
149
}
150
else
if
(fB1
>=
(Real)
0.0
)
151
{
152
fSqrDist
=
fC;
153
}
154
else
155
{
156
fSqrDist
=
fC
-
fB1
*
fB1
/
fA11;
157
}
158
}
159
}
160
else
if
(fT
<
(Real)
0.0
)
//
region 6
161
{
162
fTmp0
=
fA01
+
fB1;
163
fTmp1
=
fA00
+
fB0;
164
if
(fTmp1
>
fTmp0)
165
{
166
fNumer
=
fTmp1
-
fTmp0;
167
fDenom
=
fA00
-
((Real)
2.0
)
*
fA01
+
fA11;
168
if
(fNumer
>=
fDenom)
169
{
170
fT
=
(Real)
1.0
;
171
fS
=
(Real)
0.0
;
172
fSqrDist
=
fA11
+
((Real)
2.0
)
*
fB1
+
fC;
173
}
174
else
175
{
176
fT
=
fNumer
/
fDenom;
177
fS
=
(Real)
1.0
-
fT;
178
fSqrDist
=
fS
*
(fA00
*
fS
+
fA01
*
fT
+
((Real)
2.0
)
*
fB0)
+
179
fT
*
(fA01
*
fS
+
fA11
*
fT
+
((Real)
2.0
)
*
fB1)
+
fC;
180
}
181
}
182
else
183
{
184
if
(fTmp1
<=
(Real)
0.0
)
185
{
186
fSqrDist
=
fA00
+
((Real)
2.0
)
*
fB0
+
fC;
187
}
188
else
if
(fB0
>=
(Real)
0.0
)
189
{
190
fSqrDist
=
fC;
191
}
192
else
193
{
194
fSqrDist
=
fC
-
fB0
*
fB0
/
fA00;
195
}
196
}
197
}
198
else
//
region 1
199
{
200
fNumer
=
fA11
+
fB1
-
fA01
-
fB0;
201
if
(fNumer
<=
(Real)
0.0
)
202
{
203
fSqrDist
=
fA11
+
((Real)
2.0
)
*
fB1
+
fC;
204
}
205
else
206
{
207
fDenom
=
fA00
-
2.0f
*
fA01
+
fA11;
208
if
(fNumer
>=
fDenom)
209
{
210
fSqrDist
=
fA00
+
((Real)
2.0
)
*
fB0
+
fC;
211
}
212
else
213
{
214
fS
=
fNumer
/
fDenom;
215
fT
=
(Real)
1.0
-
fS;
216
fSqrDist
=
fS
*
(fA00
*
fS
+
fA01
*
fT
+
((Real)
2.0
)
*
fB0)
+
217
fT
*
(fA01
*
fS
+
fA11
*
fT
+
((Real)
2.0
)
*
fB1)
+
fC;
218
}
219
}
220
}
221
}
222
223
return
Math
<
Real
>
::Sqrt(Math
<
Real
>
::FAbs(fSqrDist));
224
}
225
//
----------------------------------------------------------------------------
226
三维中的实现和二维算法大体一致。
注:文章中的截图来源于:《计算机图形学集合工具算法详解》
posted on 2010-10-19 09:13
inwardly
阅读(761)
评论(0)
编辑
收藏
引用
所属分类:
WildMagic
、
计算机图形学
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
【2010-10-19】【计算机图形学】【WildMaigc】 求解 点到三角形的距离
【2010-10-17】【WildMagic】C++ 中DLL导出
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © inwardly