#include "stdafx.h"
#include "MyTuBao.h"
#include"MathUtil.h"
MyTuBao::MyTuBao()
{
} MyTuBao::MyTuBao(AcGePoint3dArray arr)
{
this->ptArr = arr;
} MyTuBao::~MyTuBao()
{
ptArr.removeAll(); } void MyTuBao::GetTuBao(AcGePoint3dArray &pArray)
{
int nums = 0;
optimizePointsArray(ptArr);
nums = ptArr.length();
if (nums > 3) {
selectMinPoint(ptArr);//寻找最小的点
quickSort(ptArr, 1, nums - 1);//用来根据极角排序点
pArray.append(ptArr[0]);
pArray.append(ptArr[1]);
pArray.append(ptArr[2]);
int top = pArray.length() - 1;
for (int i = 3; i < nums; i++)
{
while (xmul(ptArr[i], pArray[top], pArray[top - 1]) >= 0) //是否左转,是继续判断,不是,就入栈
{
pArray.removeLast();
top = pArray.length() - 1;
}
pArray.append(ptArr[i]); top = pArray.length() - 1;
} }
} void MyTuBao::GetRec(AcGePoint3dArray &pArray){
selectMinPoint(ptArr);//寻找最小的点
int nums = 0;
optimizePointsArray(ptArr);
nums = ptArr.length();
quickSort(ptArr, 1, nums - 1);//用来根据极角排序点
pArray = ptArr; }
void MyTuBao::optimizePointsArray(AcGePoint3dArray &points, double tol /*= 1.0E-7*/) { for (int i = points.length() - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (CMathUtil::IsEqual(points[i].x, points[j].x, tol) && CMathUtil::IsEqual(points[i].y, points[j].y, tol))
{
points.removeAt(i);
break;
}
}
}
} long long MyTuBao::dist(AcGePoint3d p1, AcGePoint3d p2) //两点距离的平方
{
return (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y);
} bool MyTuBao::cmp1(AcGePoint3d p1, AcGePoint3d p2) //找到第一个点,返回 true->p1比较小,false->p2比较小
{
if (p1.y == p2.y)
return p1.x<p2.x;
else
return p1.y<p2.y;
} bool MyTuBao::cmp2(AcGePoint3d p1, AcGePoint3d p2, AcGePoint3d pointMin) //极角排序的比较函数
{
if (xmul(p1, p2, pointMin)>0)
return true; //证明 p1小 选中p1
else if (xmul(p1, p2, pointMin) == 0 && dist(p1, pointMin)<dist(p2, pointMin)) //相等的按距离近的
return true; //证明 p1小 选中p1
return false;
} double MyTuBao::xmul(AcGePoint3d p1, AcGePoint3d p2, AcGePoint3d p0)
{
return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
} void MyTuBao::selectMinPoint(AcGePoint3dArray &s) {
int nums = s.length();
int cur = 0;
AcGePoint3d Min = s[0];
for (int i = 1; i<nums; i++) {
if (cmp1(s[i], Min)) {
Min = s[i];
cur = i;
}
}
s[cur] = s[0];
s[0] = Min;
acutPrintf(L"\n寻找后最小点为x=%f,y=%f", s[0].x, s[0].y);
} void MyTuBao::quickSort(AcGePoint3dArray &s, int l, int r) {
if (l< r)
{
int i = l, j = r;
AcGePoint3d x = s[l];
while (i < j)
{
while (i < j && cmp2(x, s[j], s[0])) // 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && cmp2(s[i], x, s[0])) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
quickSort(s, l, i - 1); // 递归调用
quickSort(s, i + 1, r);
}
}

分享一个Objectarx 的凸包算法的更多相关文章

  1. 福利到~分享一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  2. [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"

    [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...

  3. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  4. 分享一个c#写的开源分布式消息队列equeue

    分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...

  5. openlayer的凸包算法实现

    最近在要实现一个openlayer的凸多边形,也遇到了不小的坑,就记录一下 1.具体的需求: 通过在界面点击,获取点击是的坐标点,来绘制一个凸多边形. 2.思考过程: 1)首先,我们得先获取点击事件发 ...

  6. 圈水池 nyoj 78 凸包算法

    圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水, ...

  7. Graham Scan凸包算法

    获得凸包的算法可以算是计算几何中最基础的算法之一了.寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包. 首先介绍一下二维向量的 ...

  8. 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行

    [微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...

  9. 计算几何-凸包算法 Python实现与Matlab动画演示

    凸包算法是计算几何中的最经典问题之一了.给定一个点集,计算其凸包.凸包是什么就不罗嗦了 本文给出了<计算几何——算法与应用>中一书所列凸包算法的Python实现和Matlab实现,并给出了 ...

  10. LeetCode-587 安装栅栏及三种凸包算法的学习

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/erect-the-fence 题目描述 在一个二维的花园中,有一些用 (x, y) 坐标表示的树 ...

随机推荐

  1. 使用GUI--tkinter 制作一个批量修改文件名的桌面软件

    ''' title:批量修改文件名称 author:huyang createtime:2021-01-29 14:50:00 ''' from tkinter import * from tkint ...

  2. JMeter接口性能测试工具

    博客地址:https://blog.csdn.net/lovesoo/article/details/78579547

  3. 深入理解MD5算法:原理、应用与安全

    第一章:引言 导言 在当今数字化时代,数据安全和完整性变得至关重要.消息摘要算法是一种用于验证数据完整性和安全性的重要工具.在众多消息摘要算法中,MD5(Message Digest Algorith ...

  4. 动态规划(三)——线性dp

    一.概念 具有线性阶段划分的动态规划算法叫作线性动态规划(简称线性DP).若状态包含多个维度,则每个维度都是线性划分的阶段,也属于线性DP,如下图所示: 二.线性dp的三大经典例题 1.LIS问题:求 ...

  5. # AssertionError: The `num_classes` (3) in Shared2FCBBoxHead of MMDataParallel does not matches the length of `CLASSES` 80) in CocoDataset

    我看很多人都遇到了这个问题,有很多解决了的.我就把这篇博文再完善一下,让大家对mmdetection使用得心应手. mmdetection训练自己的数据集时报错 ️ : # AssertionErro ...

  6. python pickle模块,打包创建的对象,做持久化

    pickle提供了一个简单的持久化功能.可以将对象以文件的形式存放在磁盘上. pickle.dump(obj, file[, protocol]) 序列化对象,并将结果数据流写入到文件对象中.参数pr ...

  7. Redis介绍、使用、数据结构和集群模式总结

    Redis(Remote Dictionary Server)是一个开源的,基于内存的数据结构存储系统,它支持多种数据结构,如字符串(String).列表(List).集合(Set).有序集合(Sor ...

  8. 【知识点】如何快速开发、部署 Serverless 应用?

    简介: 本文将详细介绍如何开发和部署 Serverless 应用,并通过阿里云函数计算控制台与开发者工具 Serverless Devs 进行应用的初始化.部署:最后分享应用的调试,通过科学发布.可观 ...

  9. Apache Dubbo 3.0.0 正式发布 - 全面拥抱云原生

    简介: 一个新的里程碑! 一.背景 自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网.IT公司的实践中积累了大量经验后,Dubbo 凭借对 Java 用户友好.功能丰富.治 ...

  10. 深入浅出讲解MSE Nacos 2.0新特性

    简介: 随着云原生时代的到来,微服务已经成为应用架构的主流,Nacos也凭借简单易用.稳定可靠.性能卓越的核心竞争力成为国内微服务领域首选的注册中心和配置中心:Nacos2.0更是把性能做到极致,让业 ...