mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-08 19:44:45 +08:00
add rectf_intersect
This commit is contained in:
parent
79315b4f0b
commit
d2e165962b
@ -1,5 +1,8 @@
|
||||
# 最新动态
|
||||
|
||||
2025/04/08
|
||||
* 增加 rectf_intersect (感谢智明提供补丁)
|
||||
|
||||
2025/04/07
|
||||
* 给window增加accept_button和cancel_button的属性(感谢智明提供补丁)
|
||||
* 增加文档 how_to_set_form_enter_and_esc.md(感谢智明提供补丁)
|
||||
|
@ -791,7 +791,19 @@ ret_t vgcanvas_clip_path(vgcanvas_t* vg);
|
||||
/**
|
||||
* @method vgcanvas_clip_rect
|
||||
* 矩形裁剪。
|
||||
*
|
||||
* 备注:
|
||||
* 1. 在绘图的时候脏矩形和裁剪区是一样的。
|
||||
* 2. 该函数是不合并裁剪区的,所有可能出现裁剪区被扩大导致绘图在脏矩形以外的情况,导致残影的情况。
|
||||
* 3. 如果旋转或者缩放了,请使用 vgcanvas_intersect_clip_rect 函数,不要使用该函数。
|
||||
* ........
|
||||
* rect_t r;
|
||||
* rect_t r_save;
|
||||
* r = rectf_init(c->ox, c->oy, widget->w, widget->h);
|
||||
* r_save = *vgcanvas_get_clip_rect(vg);
|
||||
* r = rectf_intersect(&r, &r_save);
|
||||
* vgcanvas_clip_rect(vg, (float_t)r.x, (float_t)r.y, (float_t)r.w, (float_t)r.h);
|
||||
* ........
|
||||
*
|
||||
* @annotation ["scriptable"]
|
||||
* @param {vgcanvas_t*} vg vgcanvas对象。
|
||||
* @param {float_t} x x坐标。
|
||||
|
@ -194,6 +194,37 @@ rect_t rect_intersect(const rect_t* r1, const rect_t* r2) {
|
||||
return r;
|
||||
}
|
||||
|
||||
rectf_t rectf_intersect(const rectf_t* r1, const rectf_t* r2) {
|
||||
float_t top = 0;
|
||||
float_t left = 0;
|
||||
float_t bottom = 0;
|
||||
float_t right = 0;
|
||||
float_t bottom1 = 0;
|
||||
float_t right1 = 0;
|
||||
float_t bottom2 = 0;
|
||||
float_t right2 = 0;
|
||||
rectf_t r = rectf_init(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
return_value_if_fail(r1 != NULL && r2 != NULL, r);
|
||||
|
||||
bottom1 = r1->y + r1->h - 1.0f;
|
||||
bottom2 = r2->y + r2->h - 1.0f;
|
||||
right1 = r1->x + r1->w - 1.0f;
|
||||
right2 = r2->x + r2->w - 1.0f;
|
||||
|
||||
top = tk_max(r1->y, r2->y);
|
||||
left = tk_max(r1->x, r2->x);
|
||||
right = tk_min(right1, right2);
|
||||
bottom = tk_min(bottom1, bottom2);
|
||||
|
||||
r.x = left;
|
||||
r.y = top;
|
||||
r.w = right >= left ? (right - left + 1) : 0.0f;
|
||||
r.h = bottom >= top ? (bottom - top + 1) : 0.0f;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
rect_t rect_fix(rect_t* r, wh_t max_w, wh_t max_h) {
|
||||
rectX_fix;
|
||||
return *r;
|
||||
|
@ -297,6 +297,17 @@ rect_t rect_fix(rect_t* r, wh_t max_w, wh_t max_h);
|
||||
*/
|
||||
rect_t rect_intersect(const rect_t* r1, const rect_t* r2);
|
||||
|
||||
/**
|
||||
* @method rectf_intersect
|
||||
* 求两个rectf的交集。
|
||||
*
|
||||
* @param {const rectf_t*} r1 rect对象。
|
||||
* @param {const rectf_t*} r2 rect对象。
|
||||
*
|
||||
* @return {rectf_t} 返回交集。
|
||||
*/
|
||||
rectf_t rectf_intersect(const rectf_t* r1, const rectf_t* r2);
|
||||
|
||||
/**
|
||||
* @method rect_has_intersect
|
||||
* 判断两个rect的是否存在交集。
|
||||
|
@ -450,6 +450,36 @@ TEST(Rect, intersect) {
|
||||
ASSERT_EQ(r.h, 4);
|
||||
}
|
||||
|
||||
TEST(Rect, float_intersect) {
|
||||
rectf_t r;
|
||||
rectf_t r1;
|
||||
rectf_t r2;
|
||||
|
||||
r1 = rectf_init(0.5f, 0.5f, 10.5f, 10.5f);
|
||||
r2 = rectf_init(10.5f, 10.5f, 10.5f, 10.5f);
|
||||
r = rectf_intersect(&r1, &r2);
|
||||
ASSERT_EQ(r.x, 10.5f);
|
||||
ASSERT_EQ(r.y, 10.5f);
|
||||
ASSERT_EQ(r.w, 0.0f);
|
||||
ASSERT_EQ(r.h, 0.0f);
|
||||
|
||||
r1 = rectf_init(0.5f, 0.5f, 11.5f, 11.5f);
|
||||
r2 = rectf_init(10.5f, 10.5f, 10.5f, 10.5f);
|
||||
r = rectf_intersect(&r1, &r2);
|
||||
ASSERT_EQ(r.x, 10.5f);
|
||||
ASSERT_EQ(r.y, 10.5f);
|
||||
ASSERT_EQ(r.w, 1.5f);
|
||||
ASSERT_EQ(r.h, 1.5f);
|
||||
|
||||
r1 = rectf_init(0.5f, 0.5f, 14.5f, 14.5f);
|
||||
r2 = rectf_init(10.5f, 10.5f, 10.5f, 10.5f);
|
||||
r = rectf_intersect(&r1, &r2);
|
||||
ASSERT_EQ(r.x, 10.5f);
|
||||
ASSERT_EQ(r.y, 10.5f);
|
||||
ASSERT_EQ(r.w, 4.5f);
|
||||
ASSERT_EQ(r.h, 4.5f);
|
||||
}
|
||||
|
||||
TEST(Point, init) {
|
||||
point_t p = point_init(10, 20);
|
||||
ASSERT_EQ(p.x, 10);
|
||||
|
Loading…
x
Reference in New Issue
Block a user