分享一个Objectarx 的凸包算法
#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 的凸包算法的更多相关文章
- 福利到~分享一个基于jquery的智能提示控件intellSeach.js
一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】
原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...
- 分享一个c#写的开源分布式消息队列equeue
分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...
- openlayer的凸包算法实现
最近在要实现一个openlayer的凸多边形,也遇到了不小的坑,就记录一下 1.具体的需求: 通过在界面点击,获取点击是的坐标点,来绘制一个凸多边形. 2.思考过程: 1)首先,我们得先获取点击事件发 ...
- 圈水池 nyoj 78 凸包算法
圈水池 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水, ...
- Graham Scan凸包算法
获得凸包的算法可以算是计算几何中最基础的算法之一了.寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包. 首先介绍一下二维向量的 ...
- 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行
[微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...
- 计算几何-凸包算法 Python实现与Matlab动画演示
凸包算法是计算几何中的最经典问题之一了.给定一个点集,计算其凸包.凸包是什么就不罗嗦了 本文给出了<计算几何——算法与应用>中一书所列凸包算法的Python实现和Matlab实现,并给出了 ...
- LeetCode-587 安装栅栏及三种凸包算法的学习
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/erect-the-fence 题目描述 在一个二维的花园中,有一些用 (x, y) 坐标表示的树 ...
随机推荐
- 编译安装cmake,linux编译安装cmake
cmake官网:https://cmake.org/ cmake官网下载地址:https://cmake.org/download/ 现在Linux版本最新版是:cmake-3.28.0-rc5.ta ...
- C++调用Python-0:搭建环境
1.进入到Python安装目录 2.将Python安装目录中的 include 和 libs 文件夹放在 C++项目中 3.设置 附加包含目录 和 附加库目录.附加依赖项(python310_d.li ...
- openEuler20.03操作系统上安装部署MogDB2.1.1
openEuler20.03 操作系统上安装部署 MogDB2.1.1 本文出处:https://www.modb.pro/db/378319 openEuler 操作系统上安装 mogdb: 下载 ...
- TeamViewer 9发布-在Linux下安装运行
TeamViewer 9发布-在Linux下安装运行 来源:Linux中国 作者:未知 关注我们: 这篇指南介绍了怎么样在 RedHat. CentOS. Fedora 和 Debian. U ...
- opencv实现数据增强(图片+标签)平移,翻转,缩放,旋转
面试问到了,让手撕数据增强,图片+标签.这里整理一下,直接上代码. import math import cv2 import numpy as np def pan(img, anns, size= ...
- MMDeploy部署实战系列【第一章】:Docker,Nvidia-docker安装
MMDeploy部署实战系列[第一章]:Docker,Nvidia-docker安装 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给补充. 版权 ...
- 剑指offer53(Java)-在排序数组中查找数字(简单)
题目: 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2: 输入: nums = [5,7,7,8,8,1 ...
- 力扣603(MySQL)-连续空余座位(简单)
题目: 几个朋友来到电影院的售票处,准备预约连续空余座位. 你能利用表 cinema ,帮他们写一个查询语句,获取所有空余座位,并将它们按照 seat_id 排序后返回吗? 对于如上样例,你的查询语句 ...
- Docker 安装,常用命令
安装Docker 官方所有操作系统安装教程:Install Docker Engine on CentOS | Docker Documentation,其中CentOS安装docker引擎的代码: ...
- 【产品能力深度解读】连续入围Gartner魔力象限的Quick BI有何魔力?
简介: 国际权威分析机构Gartner发布2021年商业智能和分析平台魔力象限报告,阿里云Quick BI再度入选,并继续成为该领域魔力象限唯一入选的中国企业. Quick BI凭借在增强分析能力上的 ...