我将制作一个非常简单的GUI工具包。此工具包中的两个元素将是矩形和圆形按钮。我有两个问题:
#1
在圆圈,绘图索引系统或其他东西上设置带有位掩码的R-Tree会更有效吗?
通过绘制索引系统',我的意思是'绘制'画布上的GUI元素就像一个输入掩码(每个像素'是空指针或指向按钮的指针),每当窗口大小改变时更新它。每当输入事件发生时(让我们说一个悬停事件),你会:
#2
如何实施元素?从本质上讲,一旦确定了元素,应如何处理输入?我应该:
,或者
我想尽可能避免OOP。
对于任何认为这个问题含糊不清的人,它要求显示或找到一个简单的GUI工具包的最佳(如果有的话)实现,其中唯一的元素是矩形和圆形按钮,如上所述。 / p>
基本上,我问这个:
给定一组任意元素的位置/大小和光标位置,确定光标当前相交的元素的最快方法是什么?
答案 0 :(得分:2)
为了创建自己的GUI工具包,您可以选择多个选项。
<强> 1。使用第三方库库:
我推荐GTK。
在您提出它是C的库之前。
使用此库,您可以轻松创建任何按钮。要回答您的问题,您可以使用此库来引发事件并创建处理程序。
<强> 2。您不能使用&#39; dos.h&#39;直接使用硬件。和&#39; graphics.h&#39; C中的内置库:
第3。设计您的OWN工具包:
- 检测光标是否在圆圈内:
(a , b) => location on circle's center (x, y) => location of cursor r => radius of circle
我们知道如果(x,y)在圆内,则(x,y)和(a,b)之间的距离应小于半径(r)。
如果半径越大,则表明点(x,y)位于圆外。
在(x, y) and (a, b) <= r
之间的短距离内,它们相交
要找到两点之间的距离,请使用距离公式。即
sqrt((x-a)^2 + (y-b)^2)
。
- 检测光标是否在矩形内:
(这非常艰难,不得不参考高中教科书:-p)
(a,b)=&gt;矩形中心
(p,q)=&gt;矩形的任何一个顶点
L =&gt; (a,b)和(p,q)的长度
m1 =&gt; L的斜率
r =&gt;包围矩形的圆的半径
在创建矩形时,所有上述值只需计算一次。
现在用光标改变的值:
(x,y)=&gt;光标位置
dist =&gt; (x,y)和(a,b)之间的距离
m2 =&gt; dist的斜率
要找到(1,2)和(3,4)的斜率,请使用公式slope(m) = (4-2)/(3-1)
在此之后找到线L和线dist之间的角度
o =&gt; dist和L之间的角度
要找到斜率为m1和m2的两条线之间的角度,请使用公式:
在使用基本三角学后,我们知道z = L * cos(o)
其中z是图中显示的距离。
If z => dist
然后光标相交,否则它不会。
注意: 您可能想知道这是很多数学,但这是最简单的方法,大部分价值只需要计算一次,因此不需要循环它可以在O(1)时间内完成。