add rectf_intersect

This commit is contained in:
lixianjing 2025-04-08 11:29:33 +08:00
parent 79315b4f0b
commit d2e165962b
5 changed files with 88 additions and 1 deletions

View File

@ -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(感谢智明提供补丁)

View File

@ -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坐标

View File

@ -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;

View File

@ -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的是否存在交集

View File

@ -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);