基于点的位置分析,连接点和确定几何图形的问题

时间:2010-03-19 21:14:59

标签: geometry

在学校我们遇到了一个非常难的问题,但学生们还没有人解决它。看看下面的图片:

http://d.imagehost.org/0422/mreza.gif

这是一种连接点的网络,它不会结束,每个点都有自己的代表它的数字。假设数字是这样的:1-23-456-78910-etc.等等。(你不能在图片上看到数字5或8,9 ......但它们在那里,它们的位置很明显,4和6中间的点是5,依此类推)。

1连接到2和3,2连接到1,3,5和4等。

数字1-2-3表示它们代表图片上的三角形,但数字1-4-6没有,因为4与6没有直接连接。

让我们看看2-3-4-5,这是一个平行四边形(你知道为什么),但是4-6-7-9不是平行四边形,因为在这个问题中有一条规则说所有方面都必须是等于所有数字 - 三角形和平行四边形。

还有六边形,例如。 4-5-7-9-13-12是六边形 - 这里的所有边也必须相等。

12345 - 这不代表任何东西,所以我们忽略它。

我想我很好地解释了这个问题。通过使用如上所述的数字输入来确定是否是三角形/平行四边形/六边形(根据所描述的规则)给出的实际问题。

例如:

1 2 3 - triangle
11 13 24 26 -parallelogram
1 2 3 4 5 - nothing
11 23 13 25 - nothing
3 2 5 - triangle

我正在阅读计算几何以解决这个问题,但我很快放弃了,似乎没有任何帮助。一位朋友告诉我这个网站,所以我决定尝试一下。

如果您对如何解决此问题有任何想法,请回复,您可以使用伪代码或c ++。非常感谢你。

1 个答案:

答案 0 :(得分:1)

让我们点这样的点:

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

您可以将其存储在矩阵中。现在让我row[i] = the row number i is oncol[i] = the column number i is on。对于每个i,可以或多或少地计算这些。

首先,提升您的给定数字。你需要一个三角形正好3个点,平行四边形需要4个点,六角形需要6个点 - 其他任何东西你可以将其视为无数字。

请注意,根据您的规则,我们只能在此矩阵中使用直角三角形。标记三个点ABC。您可以检查这些是否形成三角形,方法是从row[A]row[B],然后从col[B]col[C],然后从row[C]row[A]对角线并检查距离是否相同以及是否到达正确的位置。您可以提前终止此操作,例如,如果B为8且A为1,那么一旦您在第1列上点击11,就可以告诉您无法找到它。

对于平行四边形,可以进行类似的推理。标记4个点ABCD并记住按升序排序(请记住,此处的点数实际上是数字)。看看您是否可以从同一行的col[A]col[B],然后从同一行的col[C]col[D],然后从{{1}对角或垂直向下从row[A]row[C]再到row[B]然后(在前一个对角线的方向相同!)。

六边形也有必须测试的特定格式。以下是六边形在这种表示中的样子:

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

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 32 33 34 35 36

你可以注意到,每两对点共用同一列,两个中间点之间的水平距离是任意两点之间垂直距离的两倍,也是任何其他两点之间水平距离的两倍。

您还需要考虑轮换,因此您需要针对每种情况进行更多测试。

除非您计划有效地计算它们,否则您甚至不需要row[D]row数组。只需遍历矩阵,直到您按照排序顺序识别第一个点,并尝试在遵循每个规则的同时找到其他点。

这不是一个很好的方法,但是你只需要一个256x256的矩阵,所以虽然这会产生相当多的代码,但它非常有效。我希望我能说清楚,如果没有,请说出不清楚的地方。无论如何,也许其他人会发布一个更好的解决方案,所以如果可以的话,再等一会儿......