- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试使用四个嵌套的四个循环来计算凸包的内部点。然而,这给了我正确的坐标,但这些坐标重复了很多次。我不确定自己做错了什么。
下面是我的方法
public final List<Point> interiorPoints(List<Point> TestPoints){
int n = points.size();
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(j != i){
for(int k = 0; k < n; k++){
if(k != j && j != i && i != k){
for(int L = 0; L < n; L++){
if(L != k && k != j && j != i && i != k && L != i && L != j){
if(pointIsInsideTriangle(points.get(i), points.get(j), points.get(k), points.get(L)) == true){
InsidePoints.add(points.get(L));
}
}
}
}
}
}
}
}
return InsidePoints;
}
如果点 L 位于三角形 i、j、k 内,则 pointIsInside 方法返回 true
当我使用以下一组点对此进行测试时:
TestPoints.add(new Point(300,200));
TestPoints.add(new Point(600,500));
TestPoints.add(new Point(100,100));
TestPoints.add(new Point(200,200));
TestPoints.add(new Point(100,500));
TestPoints.add(new Point(600,100));
我明白了
(200.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(300.0, 200.0)
(200.0, 200.0)
(300.0, 200.0)
这意味着只有 (200.0, 200.0) 和 (300.0, 200.0) 但我不确定如何解决这个问题。
这是我实现此方法的伪代码。
Algorithm: INTERIOR POINTS
for each i do
for each j = i do
for each k = j = i do
for each L = k = j = i do
if pL in triangle(pi, pj, pk)
then pL is non extreme
这是我的积分等级
public class Point
{
private final double x, y;
public Point(double x, double y)
{
this.x = x;
this.y = y;
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public void setX(double x)
{
return this.x;
}
public void setY(double y)
{
return this.y;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Point)) {
return false;
}
Point other = (Point) obj;
EqualsBuilder equalsBuilder = new EqualsBuilder();
equalsBuilder.append(x, other.x);
equalsBuilder.append(y, other.y);
return equalsBuilder.isEquals();
}
@Override
public int hashCode() {
HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
hashCodeBuilder.append(x);
hashCodeBuilder.append(y);
return hashCodeBuilder.toHashCode();
}
}
下面是我的观点在类里面
public boolean pointIsInsideTriangle(Point P, Point Q, Point r, Point t) {
final double sum;
//Area of triangle PQr
double Area_PQr = AreaOfTriangle(P, Q, r);
// Area of triangle PQr
double Area_tQr = AreaOfTriangle(t, Q, r);
// Area of triangle PQr
double Area_Ptr = AreaOfTriangle(P, t, r);
// Area of triangle PQr
double Area_PQt = AreaOfTriangle(P, Q, t);
// sum of Area_tQr, Area_Ptr and Area_PQt
sum = Area_tQr + Area_Ptr + Area_PQt;
if (Area_PQr == sum) {
System.out.println("Point t Lies inside the triangle");
return true;
}
System.out.println("Point t does not Lie inside the triangle");
return false;
}
感谢您的帮助。
最佳答案
在您的示例中,点 (200, 200)
位于三个由点定义的三角形内:
[(100, 100), (100, 500), (300, 200)]
[(100, 100), (100, 500), (600, 100)]
[(100, 100), (100, 500), (600, 500)]
请注意,上述三角形的点的任何排列都将代表同一个三角形。这意味着 (200, 200)
将在每次 L == 3
和 i
、j 的值时添加到您的列表中
和 k
是以下的一些排列:
[2, 4, 0]
[2, 4, 5]
[2, 4, 1]
n
元素的排列数由 n!
给出,因此我们将有 6 + 6 + 6 = 18
种情况,其中(200, 200)
将插入到 InsidePoints
列表中。如果您计算一下,您会发现 18 是 (200, 200)
在您的输出中出现的确切次数。同样的道理也适用于 (300, 200)
。
如果您需要每个点在结果中只出现一次,您可以通过将 InsidePoints
设为 Set
而不是 List
来轻松实现此目的>:
Set<Point> InsidePoints = new HashSet<>();
当然,您还需要为 Point
类实现 equals()
和 hashCode()
。不过,您仍然会做很多无用的计算。
为了使代码更高效,除了将 InsidePoints
转换为 Set
之外,您还可以检查一个点是否在每个三角形内部一次。这意味着 j
和 k
应该从比前一个索引大 1 的值开始,如下所示:
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
for (int k = j + 1; k < n; k++) {
for (int L = 0; L < n; L++) {
if (L != i && L != j && L != k) {
if (pointIsInsideTriangle(
points.get(i),
points.get(j),
points.get(k),
points.get(L))) {
InsidePoints.add(points.get(L));
}
}
}
}
}
}
要检查这是否有效,您可以简单地打印每次迭代的 i
、j
和 k
的值,并验证没有行是另一个的排列。
关于java - 在不先计算外壳的情况下找到凸包的内部点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29179173/
快速简单的问题: 如何制作多种颜色的开关/外壳。 我能做的是: if(color == Color.Red) color = Color.Green; else { if(color
我有这个 switch/case 结构: public void onClick(View arg0) { // TODO Auto-generated method stub swi
在我的程序中,我想使用不同的进程访问多个 linux shell。 目前我正在使用子进程我目前没有 linux 机器来测试它所以你能告诉我这是否有效。 子进程是否在一个终端上工作?如果是这样,还有其他
我在后面的代码中有三次与此示例非常相似的代码。每次开关关闭发送给它的选项。每个time case里面的代码除了一个参数是完全一样的基于案例。使用 switch/case 和方法是最好的方法去做这个?我
阅读 LTP shell code它使用奇怪的 for 循环语法: for arg; do TCID="${TCID}_$arg" done 它如何接受参数?我希望它循环遍历 $arg,用 $
这不是最有见地的问题,但我真的希望能够按 Control-L 并让 shell iex 清除屏幕。知道如何做到这一点,或者是否有另一个带有此内置功能的 Elixir shell ? 最佳答案 clea
我已经切换到 Enthought 的 Canopy 1.0.0,但我想念独立的 QT shell 和 QT notebook。我不想使用 IDE 中的内置 shell。我在哪里可以找到 QT shel
我在PyCharm中创建了新的flask项目,但看不到如何在集成的PyCharm python控制台窗口中运行flask shell。 启动控制台时未定义名称应用程序: 我仍然可以在集成的PyChar
尝试创建Prism shell 时,出现以下异常: An exception of type 'Microsoft.Practices.ServiceLocation.ActivationExcept
这个问题在这里已经有了答案: How to use the switch statement in R functions? (4 个回答) 4年前关闭。 我有一系列嵌套 if..else我想用 ca
cat < file.txt < file2.txt 我正在编写一个简单的 shell,我正在思考上面的表达式的含义。我很清楚这是什么意思:cat < file.txt,但双“<”让我困惑。 实现重定
我正在考虑使用 CompositeWPF ( http://www.codeplex.com/CompositeWPF ) - 又名 Prism,来构建我正在处理的应用程序。 该应用程序不是传统的 L
我有一个没有图形用户界面的操作类。该类主要是做数据管理。该类是从我的主 GUI 中的方法调用的。我遇到的问题是在出现故障时向用户显示消息。我正在使用 MessageDialog,但它在运行时一直失败。
我在教程中看到了两种在 BASH shell 中对 if 语句进行语法处理的方法: 除非我在变量周围加上引号并添加额外的 [ 和 ],否则这个不会工作: if [[ "$step" -eq 0 ]]
我的脚本接受键值对作为命令行参数。我测试给定数量的参数是否偶数。如果偶数,我想遍历数组,将 args[n] & args[n+1] 视为一对 (n = 0 to $# - 1) 并执行另一个将这两个作
全部!我的 CKEditor 有问题!我需要用 div 将 ul、ol 列表括起来。因此,当我按下面板上的列表按钮时,我会得到这样的结果: 最佳答
我在更改我的 Android 外壳中的所有者时遇到了一些问题。我正在尝试更改文件的所有者和组以匹配目录中的另一个文件。当我 ls -l 其他文件拥有 u0_a49 的所有者时,我尝试 su chown
平台:RHEL7 情况: JMeter 报告文件每 5 分钟通过 crontab 脚本附加新结果 另一个 awk 脚本查找响应时间大于 500 毫秒并发送电子邮件警报 问题陈述: 要求是只扫描报告文件
对于 Python,我使用 PyCrust,这是一个很好的图形外壳,感觉就像一个很好的 Java IDE(具有自动完成、内联文档并可以保存历史记录)。 Ruby 有类似的东西吗? 最佳答案 如果不需要
以下出现在我的 WinProc 中: if(message == WM_CREATE) { //Do WM_CREATE stuff } else { switch(message)
我是一名优秀的程序员,十分优秀!