gpt4 book ai didi

java - 如何使用 4 个点定义 java.awt.Rectangle?

转载 作者:行者123 更新时间:2023-11-29 08:37:53 28 4
gpt4 key购买 nike

我想在 A(16,14) B(12,18) C(8,14) D(12,10) 处绘制一个具有四个角的矩形。然后我想检查点 P(12,11) 是否在矩形内。

是否可以使用 java.awt.Rectangle 实现此目的?

我尝试了下面的代码,但没有按预期工作(报告 1, 1 在矩形内,但显然不在矩形内):

Rectangle bounds = new Rectangle(16, 14);
bounds.add(12, 18);
bounds.add(8, 14);
bounds.add(12, 10);

System.out.println(bounds.contains(1,1)); // printing true which is not right

最佳答案

java.awt.Rectangle不是您想要的工作的正确工具。 矩形 用于表示边始终平行于 x-y 坐标系轴的屏幕绘图区域。没有规定旋转角度。您指定的四边形是旋转的,因此检查 Rectangle 的边界将包括一个点,如 (8, 13),这是您不想要的。见下图:

enter image description here

更好的选择是 java.awt.Polygon .你可以通过构建它

Polygon p = new Polygon(new int[] {16, 12, 8, 12}, new int[] {14, 18, 14, 10}, 4);

或者替代地

Polygon p = new Polygon();
p.addPoint(16, 14);
p.addPoint(12, 18);
p.addPoint(8, 14);
p.addPoint(12, 10);

使用 Polygon 的主要问题是它旨在处理图形元素,并不是真正设计用于很好地处理非整数数学。如果您阅读 Polygon.contains(double, double) 的文档并点击解释内部定义的链接,您会看到 Polygon 在其左下边界上有与 Regangle 相同的问题。一种解决方法是使用 Polygon.contains(x, y, 1, 1) ,但这似乎有点矫枉过正。

更好的选择可能是使用 java.awt.geom 中的类.我个人的建议是使用 Path2D.Double . Path2D.FloatGeneralPath也是选项,但它们的精度有限。如果这对您来说没问题,请优先使用 Path2D.Float

您将使用 default constructor 构建路径:

Path2D.Double p = new Path2D.Double();

你可以忽略容量和绕组,因为你有一个小而凸起的形状。现在使用 moveTo 填写路径开始路径,lineTo添加点,然后 closePath完成矩形并进行收容工作:

p.moveTo(16, 14);
p.lineTo(12, 18);
p.lineTo(8, 14);
p.lineTo(12, 10);
p.closePath();

现在您应该看到点 (8, 13) 确实在您的形状之外:

System.out.println(p.contains(8, 13));

同样适用于 (1, 1):

System.out.println(p.contains(1, 1));

关于java - 如何使用 4 个点定义 java.awt.Rectangle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494119/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com