【求助】下面的代码 能否实现 判断简单多边形的方向.....

猴头 2013-08-14 10:24:10
是从网上 找的论文,看着论文,根据自己的理解些的,不知道 能不能满足题目的要求
代码如下:


public enum PolygonDirection
{
/// <summary>
/// 无方向性,不构成简单多边形
/// </summary>
NON = 0x0000,
/// <summary>
/// 正向简单多边形(逆时针)
/// </summary>
Forward = 0x0001,
/// <summary>
/// 负向简单多边形(顺时针)
/// </summary>
Negative = 0x0010
}


/// <summary>
/// 判断点是否在某条直线上
/// </summary>
/// <param name="point">被判断的点</param>
/// <param name="pLineStart">直线经过的点1</param>
/// <param name="pLineEnd">直线经过的点2</param>
/// <returns></returns>
public static bool IsOnline(PointF point, PointF pLineStart, PointF pLineEnd)
{
float dx = pLineStart.X - pLineEnd.X;
float dy = pLineStart.Y - pLineEnd.Y;
if (dx == 0f)
{//垂直于X轴
if (point.X == pLineStart.X)
{
return true;
}
else
{
return false;
}
}
if (dy == 0)
{//垂直于Y轴
if (point.Y == pLineStart.Y)
{
return true;
}
else
{
return false;
}
}
float k = dy / dx;
float b = pLineStart.Y - k * pLineStart.X;
float vy = k * point.X + b;
if (point.Y == vy)
{
return true;
}
else
{
return false;
}
}

/// <summary>
/// 两个向量的叉乘,两条向量必须是经过平移后有一个公用点
/// </summary>
/// <param name="pOne">第一个向量的起点</param>
/// <param name="pTwo">(公用点)第一个向量的终点,同时也是经过平移后的第二个向量的起点</param>
/// <param name="pThree">第二个向量的终点</param>
/// <returns>返回叉乘后的正负</returns>
private static float GetPointsMultiplicationCross(PointF pLast,PointF pCenter,PointF pNext)
{
float value = 0f;
float dx1 = pCenter.X - pLast.X;
float dx2 = pNext.X - pCenter.X;
float dy1 = pNext.Y - pCenter.Y;
float dy2 = pCenter.Y - pLast.Y;
value = dx1 * dy1 - dx2 * dy2;
return value;
}

/// <summary>
/// 获取点列表中的极值点(凸顶点)
/// </summary>
/// <param name="lst">点列表</param>
/// <returns></returns>
private static List<KeyValuePair<int, PointF>> GetExtremalPoints(List<PointF> lst)
{
List<KeyValuePair<int, PointF>> extremalPoints = new List<KeyValuePair<int, PointF>>();

KeyValuePair<int, PointF> minxPoint = new KeyValuePair<int, PointF>();//最左X极值点
KeyValuePair<int, PointF> minYPoint = new KeyValuePair<int, PointF>();//最上Y极值点
KeyValuePair<int, PointF> maxxPoint = new KeyValuePair<int, PointF>();//最右X极值点
KeyValuePair<int, PointF> maxyPoint = new KeyValuePair<int, PointF>();//最下Y极值点

float minx = float.MaxValue;
float miny = float.MaxValue;
float maxx = float.MinValue;
float maxy = float.MinValue;

for (int i = 0; i < lst.Count; i++)
{
if (lst[i].X < minx)
{//求最左极值点
minx = lst[i].X;
minxPoint = new KeyValuePair<int, PointF>(i, lst[i]);
}
if (lst[i].Y < miny)
{//求最上极值点
miny = lst[i].Y;
minYPoint = new KeyValuePair<int, PointF>(i, lst[i]);
}
if (lst[i].X > maxx)
{//求最右极值点
maxx = lst[i].Y;
maxxPoint = new KeyValuePair<int, PointF>(i, lst[i]);
}
if (lst[i].Y > maxy)
{//求最下极值点
maxy = lst[i].Y;
maxyPoint = new KeyValuePair<int, PointF>(i, lst[i]);
}
}

extremalPoints.Add(minxPoint);
extremalPoints.Add(minYPoint);
extremalPoints.Add(maxxPoint);
extremalPoints.Add(maxyPoint);

for (int i = 0; i < extremalPoints.Count; i++)
{//移除重复点
for (int j = extremalPoints.Count - 1; j > i; j--)
{
if (extremalPoints[i].Key == extremalPoints[j].Key)
{
extremalPoints.RemoveAt(j);
}
}
}

return extremalPoints;
}

/// <summary>
/// 根据构成简单多边形的点的序列,判断多边形的方向性
/// </summary>
/// <param name="lst">简单多边形包含的点的序列</param>
/// <returns>返回多边形的方向性</returns>
public static PolygonDirection GetPolyGonDirection(List<PointF> lst)
{
if (lst.Count < 3)
{
return PolygonDirection.NON;
}
#region []
//else if (lst.Count == 3)
//{
// if (IsOnline(lst[1], lst[0], lst[2]))
// {//三点共线
// return PolygonDirection.NON;
// }
// else
// {

// }
//}
#endregion []
else
{
PointF p1 = lst[0];
PointF p2 = lst[lst.Count - 1];
bool collineation = true;
for (int i = 1; i < lst.Count - 1; i++)
{
if (!IsOnline(lst[i], p1, p2))
{
collineation = false;
break;
}
}
if (collineation)
{//共线
return PolygonDirection.NON;
}

//极值点列表int:点在原始点列表中的索引,PointF:点的坐标
List<KeyValuePair<int, PointF>> protrudPolyLst = MathUtil.GetExtremalPoints(lst);
if (protrudPolyLst.Count > 0)
{
int index = protrudPolyLst[0].Key;
PointF centerPoint = protrudPolyLst[0].Value;
PointF lastPoint = PointF.Empty;
PointF nextPoint = PointF.Empty;
if (index == 0)
{
lastPoint = lst[lst.Count - 1];
nextPoint = lst[index + 1];
}
else if (index == lst.Count - 1)
{
lastPoint = lst[index - 1];
nextPoint = lst[0];
}
else
{
lastPoint = lst[index - 1];
nextPoint = lst[index + 1];
}
float value = MathUtil.GetPointsMultiplicationCross(lastPoint, centerPoint, nextPoint);
if (value < 0)
{
return PolygonDirection.Forward;
}
else if (value > 0)
{
return PolygonDirection.Negative;
}
else
{
return PolygonDirection.NON;
}
}
else
{//没有极值点
return PolygonDirection.NON;
}
}
}



请大侠 帮忙 分析一下,谢谢了
...全文
306 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
lzheng24 2013-08-16
  • 打赏
  • 举报
回复
楼主好人,分已接
  • 打赏
  • 举报
回复
例如这里第三个多边形,通过面积计算,可以判断是顺时针还是逆时针。
  • 打赏
  • 举报
回复
你的代码太长了,懒得看。 我想,要判断多边形方向,跟计算多边形面积基本上一样。对于个边都不想交的多边形(多边形的两条边相交,就应该报异常),按照计算面积的算法来计算,如果结果为正,就是逆时针的;否则为顺时针的。
tiwenid0 2013-08-15
  • 打赏
  • 举报
回复
根据法线的角度可以判断
猴头 2013-08-15
  • 打赏
  • 举报
回复
引用 23 楼 tcmakebest 的回复:
难道只是求测试?简单回答你 yes or no,有什么意义,你自己测吧
当然不是,是想请大家帮忙分析算法的 可靠性
搬砖的码农 2013-08-15
  • 打赏
  • 举报
回复
目测帖子已被水化,楼主做好心理准备
裸奔的蜗牛 2013-08-15
  • 打赏
  • 举报
回复
猴头 2013-08-15
  • 打赏
  • 举报
回复
引用 14 楼 yuchao890129 的回复:
水源发技术贴
已经移动了
SUPERFISH 2013-08-15
  • 打赏
  • 举报
回复
水源发技术贴
浩南_哥 2013-08-15
  • 打赏
  • 举报
回复
引用 12 楼 yan_hyz 的回复:
[quote=引用 11 楼 m617105 的回复:] 300大分放到技术区的话,肯定很多人帮你。。。。。
帖子 是 从 技术区 移过来的.....[/quote] 发到.Net或是Java,VC区, 专题开发/技术/项目 这个区人不多。 你无非是想要个思路嘛,发到人多的技术区里
猴头 2013-08-15
  • 打赏
  • 举报
回复
引用 11 楼 m617105 的回复:
300大分放到技术区的话,肯定很多人帮你。。。。。
帖子 是 从 技术区 移过来的.....
浩南_哥 2013-08-15
  • 打赏
  • 举报
回复
300大分放到技术区的话,肯定很多人帮你。。。。。
猴头 2013-08-15
  • 打赏
  • 举报
回复
引用 5 楼 java_amateur 的回复:
[quote=引用 4 楼 yan_hyz 的回复:] [quote=引用 2 楼 fqzlala 的回复:] 怎么发到水源来,都是接分的了
技术区 没人啊[/quote] 技术区 找版主[/quote] 那个技术区 都没版主
木______木 2013-08-15
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
楼主好人,接分升二胎
----大漠---- 2013-08-15
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
齊麟 2013-08-15
  • 打赏
  • 举报
回复
引用 4 楼 yan_hyz 的回复:
[quote=引用 2 楼 fqzlala 的回复:] 怎么发到水源来,都是接分的了
技术区 没人啊[/quote] 技术区 找版主
猴头 2013-08-15
  • 打赏
  • 举报
回复
引用 2 楼 fqzlala 的回复:
怎么发到水源来,都是接分的了
技术区 没人啊
加载更多回复(7)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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