求助:根据参数个数获取多边形内的坐标

JZ_7975 2012-03-31 09:03:11
已知一任意多边形的各点坐标
现在需要根据参数返回多边形内点的坐标
也就是说
如果传入3,就要返回3个坐标点的坐标
求高手解答
...全文
250 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
JZ_7975 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 9 楼 的回复:
好复杂呀,多边形貌似还有很多种,什么凸的凹的之类的。。。。LZ加油吧

你按照我说的方法画图来观察特性,就知道比较各顶点连线是最好的做法了,不管是凸的凹的,都满足这个角度关系,唯独这个角度值的比较如何对应到正切值的比较(y1-y2)/(x1-x2),这个需要自己写一个函数来包装下,其中需要判断对应的角度是第几像素的。
[/Quote]
谢了,我先按照你的步骤来试试看吧。上次弄个根据2点坐标算出角度,搞了好长时间了
哎,数学没学好,真悲哀啊。。。
JZ_7975 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

内接矩形算不出,可以算内切圆
要加个条件 x,y要在圆内

具体算法
http://wenku.baidu.com/view/a6179d6527d3240c8447ef66.html
[/Quote]
这个想法也不错啦,我先看看。
JZ_7975 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

把函数GetPointInPolygon改造了一下,加了个随机点是否在多边形内的判断,这回应该可以了
C# code
/// <summary>
/// 获取多边形内随机坐标点
/// </summary>
/// <param name="count">获取左边点数量</param>
/// <param name="poi……
[/Quote]
谢了,我先看看。
636f6c696e 2012-04-06
  • 打赏
  • 举报
回复
白虎的算法不错。
依次算出和多边形每条边形成的三角形的顶角,和为360的即为内部
qldsrx 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
好复杂呀,多边形貌似还有很多种,什么凸的凹的之类的。。。。LZ加油吧
[/Quote]
你按照我说的方法画图来观察特性,就知道比较各顶点连线是最好的做法了,不管是凸的凹的,都满足这个角度关系,唯独这个角度值的比较如何对应到正切值的比较(y1-y2)/(x1-x2),这个需要自己写一个函数来包装下,其中需要判断对应的角度是第几像素的。
qldsrx 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
感觉好复杂,数学没学好。。。
[/Quote]
最后那句“严重次数刚好等于多边形的顶角数。”,应该是“验证次数刚好等于多边形的顶角数。”

要理解我说的角度,你必须学会画图,首先在纸上画一个多边形,然后在多边形内部画一个点,将该点和多边形的所有顶点连接起来,观察这些连线的特性(其实这是几何知识)。
assky124 2012-04-05
  • 打赏
  • 举报
回复
内接矩形算不出,可以算内切圆
要加个条件 x,y要在圆内

具体算法
http://wenku.baidu.com/view/a6179d6527d3240c8447ef66.html
assky124 2012-04-05
  • 打赏
  • 举报
回复
如果随机点没有条件限制的话,先计算出多边形的内接矩形rect,然后用Random取
X [rect.Left,rect.Right]
Y [rect.Top,rect.Bottom]
gxingmin 2012-04-05
  • 打赏
  • 举报
回复
呵呵,把myGraphicsPath.AddPolygon(pParam);
改成
myGraphicsPath.AddPolygon(point);
冰镇宝贝321 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
把函数GetPointInPolygon改造了一下,加了个随机点是否在多边形内的判断,这回应该可以了

C# code

/// <summary>
/// 获取多边形内随机坐标点
/// </summary>
/// <param name="count">获取左边点数量</param>
/// <param na……
[/Quote]



石头++++
gxingmin 2012-04-05
  • 打赏
  • 举报
回复
把函数GetPointInPolygon改造了一下,加了个随机点是否在多边形内的判断,这回应该可以了
 /// <summary>
/// 获取多边形内随机坐标点
/// </summary>
/// <param name="count">获取左边点数量</param>
/// <param name="point">多边形的各个点</param>
/// <returns></returns>
public Point[] GetPointInPolygon(int count, Point[] point)
{
if (point.Length < 3)
return null; //不是多边形

int x1 = int.MaxValue;
int x2 = int.MinValue;
int y1 = int.MaxValue;
int y2 = int.MinValue;

foreach (Point p in point)
{
if (p.X < x1)
x1 = p.X;
if (p.X > x2)
x2 = p.X;
if (p.Y < y1)
y1 = p.Y;
if (p.Y > y2)
y2 = p.Y;
}


GraphicsPath myGraphicsPath = new GraphicsPath();
Region myRegion = new Region();
myGraphicsPath.Reset();
myGraphicsPath.AddPolygon(pParam);
myRegion.MakeEmpty();
myRegion.Union(myGraphicsPath);

Random rnd = new Random((int)DateTime.Now.Ticks);
Point[] pointRet = new Point[count];
int n=0;
while(n<count)
{
Point p = new Point(rnd.Next(x1, x2), rnd.Next(y1, y2));
if (myRegion.IsVisible(p)) //在多边形内
{
pointRet[n] = p;
n++;
}

}
return pointRet;
}
gxingmin 2012-04-05
  • 打赏
  • 举报
回复
不好意思,貌似上面的逻辑不太对,即使在最小最大值区间内,也有可能在多边形外
gxingmin 2012-04-05
  • 打赏
  • 举报
回复
应该很好弄啊,你那应该是凸多边形吧,根据参数坐标获取最小的x坐标为x1和最大x坐标为x2,最小的y坐标为y1和最大的y坐标为y2

然后随机(x1~x2)范围的值作为x坐标,随机(y1~y2)范围的值作为y坐标,作为一个内点

   private void Form1_Load(object sender, EventArgs e)
{
Point[] pParam = new Point[] { new Point(12, 34), new Point(3, 5), new Point(45, 56), new Point(126, 6) };
Point[] pIn = GetPointInPolygon(2, pParam);

}

/// <summary>
/// 获取多边形内随机坐标点
/// </summary>
/// <param name="count">获取左边点数量</param>
/// <param name="point">多边形的各个点</param>
/// <returns></returns>
public Point[] GetPointInPolygon(int count, Point[] point)
{
if (point.Length < 3)
return null; //不是多边形

int x1 = int.MaxValue;
int x2 = int.MinValue;
int y1 = int.MaxValue;
int y2 = int.MinValue;

foreach (Point p in point)
{
if (p.X < x1)
x1 = p.X;
if (p.X > x2)
x2 = p.X;
if (p.Y < y1)
y1 = p.Y;
if (p.Y > y2)
y2 = p.Y;
}

Random rnd = new Random((int)DateTime.Now.Ticks);
Point[] pointRet = new Point[count];
for (int i = 0; i < count; i++)
{
pointRet[i] = new Point(rnd.Next(x1, x2), rnd.Next(y1, y2));
}
return pointRet;
}
nvshenxp 2012-04-05
  • 打赏
  • 举报
回复

好复杂呀,多边形貌似还有很多种,什么凸的凹的之类的。。。。LZ加油吧
JZ_7975 2012-04-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

这问题其实很好办,首先是构建多边形,用字典缓存构建好的多边形的每个坐标点及其相邻2边角度值,之后就任取一点,验证该点和每个坐标点连线的角度,所选取的点必须满足在相邻2边角度范围内,严重次数刚好等于多边形的顶角数。
[/Quote]
感觉好复杂,数学没学好。。。
qldsrx 2012-04-01
  • 打赏
  • 举报
回复
这问题其实很好办,首先是构建多边形,用字典缓存构建好的多边形的每个坐标点及其相邻2边角度值,之后就任取一点,验证该点和每个坐标点连线的角度,所选取的点必须满足在相邻2边角度范围内,严重次数刚好等于多边形的顶角数。
JZ_7975 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你问题的关键是什么?说详细些 或者把代码贴出来啊
[/Quote]
如有坐标,12,34、3,5、45,56、126,6...
如何根据这个多边形的坐标,随机的得出n个坐标,
当让这N个坐标,必须是在这个多边形内
JZ_7975 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你问题的关键是什么?说详细些 或者把代码贴出来啊
[/Quote]
怪我,没描述清楚,想实现的效果如下:
用户自定义了一个多边形
想在里面随机的显示若干个点
显示的个数实际上通过参数进行传递的

问题是,我不知道如何取点,并且这些点,正好是在这个多边形内


色拉油 2012-03-31
  • 打赏
  • 举报
回复
言之有理,返回对象就行[Quote=引用 1 楼 的回复:]

那你返回值类型设置为List<Point>不就可以了吗?
[/Quote]
lhonyun_lhy 2012-03-31
  • 打赏
  • 举报
回复
你问题的关键是什么?说详细些 或者把代码贴出来啊
加载更多回复(1)

110,499

社区成员

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

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

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