Javis March计算凸包问题

根据邓老师的讲解,实现Javis March算法计算凸包,但是时间复杂度并没有直接降低,在最坏的情况下还是O(n^2).
实际上,该算法是在极边法上的改进,降低算法寻找边的复杂度..

具体的计算过程如下描述.

#include <iostream>
#include <vector>

using namespace std;

struct point
{
    point(int _x = 0, int _y = 0) : x(_x), y(_y) {}

    int x;
    int y;
};

enum Loc
{
    left,
    online,
    right
};

struct node
{
    node(point _p) : p(_p), next(nullptr), prev(nullptr) {}

    point p;
    node *prev;
    node *next;
};

int Area(point p, point q, point s)
{
    return p.x * q.y - p.y * q.x +
           q.x * s.y - q.y * s.x +
           s.x * p.y - s.y * p.x;
}

Loc ToLeft(point p, point q, point s)
{
    auto area = Area(p, q, s);
    if (area > 0)
        return Loc::left;
    if (area == 0)
        return Loc::online;
    if (area < 0)
        return Loc::right;
}

int Ltl(vector<point> points)
{
    int ltl = 0;
    for (int i = 0; i < points.size(); ++i)
    {
        if (points[i].y < points[ltl].y || (points[i].y == points[ltl].y && points[i].x < points[ltl].x))
            ltl = i;
    }
    return ltl;
}

int main()
{
    vector<point> points = {
            {1, 1},
            {2, 2},
            {2, 0},
            {2, 4},
            {3, 3},
            {4, 2}
    };
    vector<bool> flag(points.size(), false);
    int ltl = Ltl(points);
    vector<point> res;
    int k = ltl;
    do
    {
        res.push_back(points[k]);
        int s = -1;
        for (int i = 0; i < points.size(); ++i)
        {
            if (i != k && i != s &&
                (s == -1 || ToLeft(points[k], points[s], points[i]) != Loc::left)
                    && (flag[i] == false))
                s = i;
        }
        k = s;
        flag[k] = true;
    } while (k != ltl);

    for(auto p: res)
        cout << p.x << " " << p.y << endl;
    return 0;
}

参考

1 学堂在线-计算几何

对于想要在Android手机上部署深度学习模型,但又不想学习Java开发的开发者,可以考虑以下方法。首先,可以复刻别人的整个项目,并将其中的模型替换为自己的模型,然后对项目进行魔改。这样可以避免从头开始开发,并且可以根据自己的需求进行修改。\[1\] 在开始之前,需要下载一些组件,包括SDK和NDK。在Android Studio中,可以通过File->Settings来设置SDK的路径,默认路径为C:\Users\Javis\AppData\Local\Android\Sdk。然后,勾选需要的组件,例如ncnn-android-squeezenet项目。\[2\] 如果使用的是Windows 10和Android Studio 3.5.2,可以从http://www.android-studio.org下载安装Android Studio。如果遇到"unable to access android sdk add-on list"的问题,可以点击cancel,然后默认安装即可。\[3\] 通过以上步骤,你就可以在Android Studio中进行深度学习相关的开发了。希望对你有所帮助! #### 引用[.reference_title] - *1* [【1】安卓上部署深度学习模型【MNN,NCNN】](https://blog.csdn.net/qq_33596242/article/details/125190548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ncnn笔记:01)windows+AndriodStudio在安卓机上快速构建一个深度学习分类模型](https://blog.csdn.net/jiangpeng59/article/details/108759414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值