gpt4 book ai didi

c - GUI系统实现

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

我将制作一个非常简单的 GUI 工具包。该工具包中的两个元素是一个矩形按钮和一个圆形按钮。我有两个问题:


#1

R-Tree 会不会更有效率?在圆圈上使用位掩码、绘图索引系统或其他完全不同的东西?

“绘图索引系统”是指在 Canvas 上“绘制”GUI 元素,就像输入掩码一样(每个“像素”是空指针或指向按钮的指针),每当窗口大小时更新它变化。每当发生输入事件(比方说悬停事件)时,您将:

  • 获取光标位置
  • 计算该点在输入 Canvas 上的索引(就像处理图像一样)
  • 从该索引中检索指向相应 GUI 元素的指针。

#2

元素应该如何实现?本质上,一旦确定了元素,应该如何处理输入?我应该:

  • 在实际的帧缓冲区上绘制一些东西,然后运行回调(如果存在指针)以获得功能?

或者,

  • 启动“悬停”回调,它可能决定也可能不决定在帧缓冲区上绘制。

如果可能的话,我想避免 OOP。


对于任何认为这个问题含糊不清的人,它要求显示或找到一个简单的 GUI 工具包的最佳(如果有的话)实现,其中唯一的元素是一个矩形和圆形按钮,如上所述。

本质上,我是在问这个:

Given a set of positions/sizes of arbitrary elements and the cursor position, what is the quickest way to determine which element the cursor is currently intersecting?

最佳答案

为了创建您自己的 GUI 工具包,您有多种选择。

<强>1。使用第三方库库:

  • 我推荐 GTK .

  • 在您询问之前,它是 C 的库。

  • 使用此库,您可以轻松创建任何按钮。要回答您的问题,您可以使用此库引发事件并创建处理程序。

<强>2。您不能通过使用 C 中的“dos.h”和“graphics.h”内置库直接使用硬件:

<强>3。设计您自己的工具包:

- 检测光标是否在圆圈内:

   (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之间的短距离内然后它们相交

To find distance between two points use distance formula. ie sqrt((x-a)^2 + (y-b)^2).

- 检测光标是否在矩形内:

(这很艰难,不得不引用高中课本:-p)

(a, b) => center of rectangle

(p, q) => any one vertex of rectangle

L => length of (a, b) and (p, q)

m1 => slope of L

r => radius of circle enclosing the rectangle

以上所有值只需在创建矩形时计算一次。

现在随光标变化的值:

(x, y) => position of cursor

dist => distance between (x, y) and (a, b)

m2 => slope of dist

要计算 (1, 2) 和 (3, 4) 的斜率,请使用公式 slope(m) = (4-2)/(3-1)

在此之后找到线 L 和线 dist 之间的角度

o => angle between dist and L

要计算斜率为 m1 和 m2 的两条线之间的角度,请使用公式:

enter image description here

在使用基本三角学之后我们知道 z = L * cos(o)其中 z 是图中所示的距离。

If z => dist然后光标相交,否则不相交。

sorry for my handwriting

enter image description here

注意: 您可能想知道这是很多数学问题,但这是最简单的方法,而且大部分值只需计算一次,并且不需要循环,所以它可以在 O(1) 时间内完成。

关于c - GUI系统实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163787/

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