分享一个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) 坐标表示的树 ...
随机推荐
- HMS Core机器学习服务,高效助力跨语种沟通
5月24日, HUAWEI Developer Day(简称HDD)线上沙龙·创新开发专场活动成功举办.HMS Core机器学习服务(ML Kit)产品经理在会上围绕机器翻译的技术优势.使用场景和接入 ...
- Linux系统 g++ 链接 libopencv_world.a 静态库编译程序
编译opencv,我是直接编译成 libopencv_world.a 一个文件 正常链接编译,容易报错:main: hidden symbol `opj_read_header' isn't def ...
- CentOS 8 安装更新国内清华大学源手记【亲测成功】
一直和各种OS打交道,仍觉得自己是小白,故深知小白们的困惑和蛋碎,特此将安装更新源的细节和步骤做了详细整理,供大家参考.红字是命令和提示,深灰色代码框中是源配置,本文采用了清华大学CentOS 8的源 ...
- 记一次 .NET某炉膛锅炉检测系统 崩溃分析
一:背景 1. 讲故事 上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚 ...
- js获取时间差,返回格式为01天02小时03秒
// 获取时间差 返回值格式:01天02小时30秒 export function caclulateDiffTime(start, end): string { start = new Date(s ...
- 力扣217(java&python)-存在重复元素(简单)
题目: 给你一个整数数组 nums .如果任一值在数组中出现 至少两次 ,返回 true :如果数组中每个元素互不相同,返回 false . 示例 1: 输入:nums = [1,2,3,1]输出:t ...
- 力扣640(java)-求解方程(中等)
题目: 求解一个给定的方程,将x以字符串 "x=#value" 的形式返回.该方程仅包含 '+' , '-' 操作,变量 x 和其对应系数. 如果方程没有解,请返回 "N ...
- 力扣319(java)-灯泡开关(中等)
题目: 初始时有 n 个灯泡处于关闭状态.第一轮,你将会打开所有灯泡.接下来的第二轮,你将会每两个灯泡关闭第二个. 第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开).第 i 轮 ...
- EasyNLP玩转文本摘要(新闻标题)生成
简介: 本⽂将提供关于PEGASUS的技术解读,以及如何在EasyNLP框架中使⽤与PEGASUS相关的文本摘要(新闻标题)生成模型. 作者:王明.黄俊 导读 文本生成是自然语言处理领域的一个重要研究 ...
- 阿里云EMAS移动测试,帮您快速掌握移动端兼容性测试技巧
简介: 兼容性测试用于验证应用在不同设备上进行安装/启动/登录/不同版本覆盖安装/卸载等操作时,是否存在兼容性问题:如界面适配问题.应用性能等,现阿里云EMAS套餐免费试用,帮您快速掌握移动端兼容性测 ...