海康威视 U3D客户端开发 一面

1. 自我介绍和项目介绍

2.怎么判断一个点在凸多边形里面

答案:如果是凸多边形,最常见的方法就是判断这个点是否始终在每一条边的同一侧。具体做法是依次计算多边形每条边和目标点构成的叉积,如果所有叉积同号,说明点在凸多边形内部;如果有正有负,说明点在外部。这种方法的好处是实现简单,时间复杂度是 O(n),很适合面试时手写。

代码:

#include <vector>
using namespace std;

struct Point {
    double x, y;
};

double cross(const Point& a, const Point& b, const Point& c) {
    return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}

bool isPointInConvexPolygon(const vector<Point>& poly, const Point& p) {
    int n = poly.size();
    if (n < 3) return false;

    double prev = 0;
    for (int i = 0; i < n; ++i) {
        double cur = cross(poly[i], poly[(i + 1) % n], p);
        if (cur != 0) {
            if (prev != 0 && cur * prev < 0) return false;
            prev = cur;
        }
    }
    return true;
}

3. 怎么判断一个点在平面多边形里面

答案:如果题目没有强调是凸多边形,那通常默认是普通多边形。这时候最常见的方法是射线法。从目标点向一个固定方向引一条射线,统计它和多边形边的交点个数。如果交点个数是奇数,说明点在多边形内部;如果是偶数,说明点在外部。这种方法实现比较通用,但要注意边界情况,比如点刚好在边上、射线经过顶点、水平边重复统计这些问题。

代码:

#include <vector>
#include <algorithm>
using namespace std;

struct Point {
    double x, y;
};

bool onSegment(const Point& a, const Point& b, const Point& p) {
    double cross = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
    if (cross != 0) return false;
    return p.x >= min(a.x, b.x) && p.x <= max(a.x, b.x) &&
           p.y >= min(a.y, b.y) && p.y <= max(a.y, b.y);
}

bool isPointInPolygon(const vector<Point>& poly, const Point& p) {
    int n = poly.size();
    bool inside = false;

    for (int i = 0, j = n - 1; i < n; j = i++) {
        if (onSegment(poly[j], poly[i], p)) return true;

        bool intersect = ((poly[i].y > p.y) != (poly[j].y > p.y)) &&
                         (p.x < (poly[j].x - poly[i].x) * (p.y - poly[i].y) /
                                    (poly[j].y - poly[i].y) + poly[i].x);
        if (intersect) inside = !inside;
    }
    return inside;
}

4. Protobuf 和 JSON 的区别

答案:这两个本质上都是数据序列化方式,但特点不一样。JSON 是

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
总结的真的很好
点赞 回复 分享
发布于 03-24 23:41 北京

相关推荐

工作职责&nbsp;1、参与大型商业游戏的客户端开发,深入理解玩法设计,将策划案转化为稳定、可扩展的代码实现;2、使用游戏引擎开发核心模块,如:AI、角色3C(移动/镜头/控制)、战斗逻辑、UI系统、场景管理、性能优化等;3、与策划、美术紧密协作,参与技术方案设计,为游戏体验提升提供专业建议;4、攻克网络同步、内存优化、渲染效率等技术难点,保障玩家流畅体验。任职要求1、计算机相关专业,具备扎实的计算机基础(数据结构/算法/操作系统/网络);2、热爱编程,至少掌握一种游戏开发常用的编程语言,并深入了解其思想、原理和底层细节;3、具备系统性的编程思维,能对复杂问题进行拆解并设计清晰解决方案;4、逻辑思考、沟通表达清晰,具备团队协作意识,对技术难题有强烈的好奇心和攻克欲望;5、具备快速学习能力,能主动跟进游戏开发领域的新技术趋势。加分项1、有游戏项目开发经验(课程设计/实习/个人Demo均可);2、熟悉Unity/虚幻等游戏引擎的基础使用;3、热爱游戏,对优秀游戏的交互细节和技术实现有观察思考;4、参与过开源项目或有技术博客/GitHub作品集;5、有&nbsp;AIGC、代码大模型提效、AI&nbsp;自动化、AI&nbsp;Agent&nbsp;等相关AI应用经验者优先面向对象2026届(2025.9-2026.8之间毕业)投递链接https://jobs.mihoyo.com/?sharePageId=121176&amp;recommendationCode=052BT&amp;isRecommendation=true#/campus/position/7970
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务