gpt4 book ai didi

c++ - 定位涉及线和圆相交的小部件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:04:03 33 4
gpt4 key购买 nike

这是我要为我的游戏解决的问题。

我有这样的场景: enter image description here

我正在尝试求解绿色矩形的位置和大小。圆圈占屏幕的 50%、40%,其半径与屏幕的高度成正比。

绿色矩形必须始终距离底部 10 个像素。它的左角也必须相距 10 个像素。从图中可以看出,从右上角到矩形接触到圆的距离也是 10 像素。

另一个约束是绿色矩形的宽度必须始终是其高度(纵横比)的 3 倍。

鉴于这些限制条件,我该如何求解绿色矩形的位置和大小?

本质上,游戏窗口可以有多种不同的宽高比,因此绿色矩形在任何这些情况下都必须看起来不错。

我不一定是在寻找代码,而只是想知道如何解决这个问题。

谢谢

最佳答案

在这些情况下要做的是用数学方法描述约束,看看它是否可以简化。这是几何处理的必备技能。

假设图像区域的左下角是 (0,0)。这使得矩形的左下角位于 (10,10);我们将调用右上角 (x1,y1)。我假设您已经计算出圆的位置,因为这非常简单,我们将其称为圆心 (x2,y2) 和半径 r。

第一个约束:矩形的宽度是高度的 3 倍。

x1-10 = 3 * (y1-10)  or  x1 = 3 * (y1-10) + 10  or  x1 = 3*y1 - 20

第二个约束:x1,y1 距离圆 10 个像素。如果我们描述另一个比第一个大 10 像素的圆,则点将位于圆上。

(x1-x2)^2 + (y1-y2)^2 = (r+10)^2

代替 x1:

(3*y1 - 20 - x2)^2 + (y1-y2)^2 = (r+10)^2

这很好,因为 r、x2 和 y2 是已知的;唯一未知的是 y1。让我们看看是否可以将所有 y1 聚集在一起。

(3*y1 + (-20 - x2))^2 + (y1-y2)^2 = (r+10)^2
3^2*y1^2 + 2*(3*y1*(-20-x2) + (-20-x2)^2 + y1^2 + 2*y1*-y2 + y2^2 = (r+10)^2
3^2*y1^2 + y1^2 + 6*(-20-x2)*y1 + 2*-y2*y1 + y2^2 = (r+10)^2
(3^2+1)*y1^2 + (-120 - 6*x2 - 2*y2)*y1 + y2^2 = (r+10)^2

此时它看起来几乎像一个二次方程。再做一个小调整:

10 * y1^2 + (-120 - 6*x2 - 2*y2) * y1 + (y2^2 - (r+10)^2) = 0

最后一步是应用 Quadratic Formula .

a*y1^2 + b*y1 + c = 0
a = 10
b = (-120 - 6*x2 - 2*y2)
c = (y2^2 - (r+10)^2)
y1 = (-b +/- sqrt(b^2 - 4*a*c)) / 2*a

二次方程式有两个可能的答案,但其中一个会将矩形放在圆的远侧。消除这种情况应该很容易。

关于c++ - 定位涉及线和圆相交的小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122640/

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