当前位置: 首页 > news >正文

c语言判断某个点是否在凸四边形内部,边界范围用


#include <stdio.h>
#include <stdbool.h>
#include <math.h>typedef struct {double x, y;
} Pointxy;// 计算向量叉积 (p2-p1) × (p3-p1)
static double crossProduct(Pointxy p1, Pointxy p2, Pointxy p3) {return (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
}
// 判断点是否在线段上(考虑浮点数精度)
static bool isPointOnSegment(Pointxy p1, Pointxy p2, Pointxy p) {// 计算叉积,如果为0则点在线段所在直线上double cross = crossProduct(p1, p2, p);if (fabs(cross) > 1e-10) {return false;}// 检查点是否在两个端点之间double min_x = fmin(p1.x, p2.x);double max_x = fmax(p1.x, p2.x);double min_y = fmin(p1.y, p2.y);double max_y = fmax(p1.y, p2.y);return (p.x >= min_x - 1e-10 && p.x <= max_x + 1e-10 &&p.y >= min_y - 1e-10 && p.y <= max_y + 1e-10);
}
// 判断点是否在凸四边形内部
static bool isPointInConvexQuad(Pointxy quad[4], Pointxy p) {// // 检查点是否在四边形的边界上// for (int i = 0; i < 4; i++) {//     if (isPointOnSegment(quad[i], quad[(i + 1) % 4], p)) {//         return true;//     }// }// 检查点是否在所有边的同一侧(对于凸四边形)double d1 = crossProduct(quad[0], quad[1], p);double d2 = crossProduct(quad[1], quad[2], p);double d3 = crossProduct(quad[2], quad[3], p);double d4 = crossProduct(quad[3], quad[0], p);// // 对于凸四边形,所有叉积应该同号(都在内部或都在外部)// // 我们检查是否都在内部(>0)或都在外部(<0)bool has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0) || (d4 < 0);bool has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0) || (d4 > 0);return !(has_neg && has_pos);
}// 判断矩形是否在凸四边形内部
static bool isBoxInConvexQuad(Pointxy quad[4], Pointxy boxMin, Pointxy boxMax) {// 矩形的四个顶点Pointxy vertices[4] = {{boxMin.x, boxMin.y},{boxMin.x, boxMax.y},{boxMax.x, boxMin.y},{boxMax.x, boxMax.y}};//任何一个在里面,就满足for (int i = 0; i < 4; i++) {if (isPointInConvexQuad(quad, vertices[i])) {return true;}}return false;// // 检查矩形的每个顶点是否都在四边形内部// for (int i = 0; i < 4; i++) {//     if (!isPointInConvexQuad(quad, vertices[i])) {//         return false;//     }// }// return true;
}// 定义一个凸四边形(按顺时针或逆时针顺序)
Pointxy quad[4] = {{10, 10},{20, 10},{25, 20},{ 5, 20}
};
void test_point(Pointxy testPoint){// Pointxy testPoint = {5, 2};printf("点 x:%lf,y:%lf  ",testPoint.x,testPoint.y);if (isPointInConvexQuad(quad, testPoint)) {printf("点在四边形内部\n");} else {printf("点不在四边形内部\n");}
}
void test_box(Pointxy boxMin,Pointxy boxMax){// Pointxy boxMin = {1, 1};// Pointxy boxMax = {5, 5};printf("box x:%lf,y:%lf w:%lf,h:%lf  ",boxMin.x,boxMin.y,boxMax.x-boxMin.x,boxMax.y-boxMin.y);if (isBoxInConvexQuad(quad, boxMin, boxMax)) {printf("矩形在四边形内部\n");} else {printf("矩形不在四边形内部\n");}
}// 编译运行  g++ 00_test_box.cpp -o 00_test_box && ./00_test_box
int main() {// 测试点printf("\n\ntest 点 外面\n");//外面test_point({0,0});test_point({15,5});test_point({5,15});test_point({15,25});test_point({25,15});//里面printf("\n\ntest 点 里面\n");test_point({15,15});test_point({11,11});test_point({10,10});// 测试矩形printf("\n\ntest 矩形\n");test_box({1,1},{5,5});//外test_box({1,1},{15,15});//里return 0;
}
http://www.jsqmd.com/news/59564/

相关文章:

  • Pytorch随笔:gather函数
  • 博士留学导师资源榜单:谁的学术人脉覆盖全球名校?
  • 2025 年优质空压机厂家 TOP10 盘点,各行业适配之选全解析
  • 流体管道、医疗器械、电机:乐泰胶水全场景推荐
  • 乐泰胶水好用吗?专家深度分享心得
  • 2025 年 12 月红木办公家具权威推荐榜:红木办公桌/红木老板桌/红木大班台,红木办公椅,红木书桌椅,红木书房套装,红木文件柜,古典与现代的完美融合!
  • 使用NVIDIA Isaac Lab和Newton训练机器人策略与布料模拟
  • 2025年度中央空调品牌推荐排行榜,新测评精选中央空调品牌
  • 2025 年 12 月红木床/红木双人床/红木大床/红木雕花床/红木架子床推荐榜单,红木卧室套装,红木床头柜/红木衣柜,经典传承与现代设计完美融合!
  • 2025 年 12 月红木家具品牌权威推荐榜:东方红木家居,传承经典工艺与现代设计的完美融合!
  • 2025年必应推广代运营服务商综合评测:基于实力与效果的五家推荐
  • 部署:海豚调度(DolphinScheduler部署)(单机Standalone部署)
  • 实测花灯厂家,技术强的原来是这家!避坑指南
  • 7000-8000价位游戏本怎么选?五大高性价比机型横评,闭眼入不踩雷!
  • verl grpo 快速开始
  • LLM 投毒 [1/3] - 解读Transformer的“思想”
  • 博士留学录取率榜单出炉:谁的Offer产出能力最强?
  • 前端文件上传终极指南:从原理到架构实践! - 实践
  • 2025年美的真暖空气能中央空调品牌权威推荐榜单:美的尊享HNM1壁挂炉‌/美的明装暖气‌/美的真享水科技中央空调‌品牌精选
  • 2025年泡沫模块供货厂家权威推荐榜单:工业化循环水养殖‌/海容模块建房‌/鱼池墙体材料‌源头厂家精选
  • 2025年中国十大超声波吐司面包切割机服务商推荐:哪家售后服
  • 2025年打工人代餐清单:上班族便携即食的低热量代餐品牌推荐
  • ScheduledExecutorService中调度方法scheduleWithFixedDelay,scheduleAtFixedRate,schedule的异同
  • 今日收获小SB一枚
  • 深入解析:⸢ 拾贰 ⸥⤳ 实战攻防演练:红蓝对抗 有效性检验
  • 2025年汽车零部件柔性抓取解决方案:柔触机器人如何赋能车灯自动化搬运
  • sql server 导出excel表
  • 2025年市场热销雷达干扰模拟器品牌实力排行,无线信号测量仪表/以太网测试仪/光通信测量仪表雷达干扰模拟器企业推荐排行榜单
  • 【文章管理系统团队】Alpha阶段Scrum冲刺第2天随笔