实用算法实践-第 29 篇 计算几何学

【几何】中学几何、解析几何、计算几何 这是一个关于C++算法与数据结构中计算几何主题的博客目录页面,包含了基础知识、力扣题目和洛谷题目的分类整理。 主要结构 1. 基础知识部分 三角函数和角公式、矢量旋转 线段求交点算法 点到矢量投影 三角形外心计算 跨立实验 线段间距离计算 仿射变换与齐次坐标 平面凸包等基础计算几何概念 2. 力扣题目(LeetCode) 包含8个计算几何相关的题目,每个都有相应的难度分数(如1681、1708等) 3. 洛谷题目 包含13个题目,覆盖从普及到普及+的不同难度等级 阅读详情

29.1    最近点对

“最近”是指通常意义上的欧几里德距离。《算法导论》中对这个问题进行了介绍。[i]问对于经典的分治法求最近点对有深入的介绍和详尽的伪代码。

29.1.1   实例

PKU JudgeOnline, 3714, Raid.

29.1.2   问题描述

给定n个岗位和n个战士的坐标(0 ≤ X ≤1000000000, 0 ≤ Y ≤ 1000000000)。问这些战士当中,离某个岗位最近的距离是多少?

29.1.3   输入

2

4

00

01

10

11

22

23

32

33

4

00

00

00

00

00

00

00

0 0

29.1.4   输出

1.414

0.000

29.1.5   分析

这也是一个最近距离的问题,只不过是两个集合中的元素的最近距离的问题。采用的方法不同于经典的最近距离点对的分治算法,但是思想上也有类似的地方。

对于每个战士(x0, y0),首先找到一个点,这个点是x最接近x0的所有点中y最接近y0的点,求出(x, y)、(x0, y0)两点距离dis。若minDis > dis,令minDis = dis。在[x - minDis, x + minDis]的横坐标范围内移动x,并对每个x,寻找y最接近y0的点(x, y),若minDis > dis,令minDis = dis。

上述描述中,“最接近x0的x”或者“最接近y0的y”都通过对有序数组的二分查找法来找出。

29.1.6   程序

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <math.h>
#define ONLINE_JUDGE 0
#define maxNum     100001
#define MAX   0x7FFFFFFF
#define __int64MAX 0x7FFFFFFFFFFFFFFF
struct position
{
     int x;
     int y;
};
int cmp(const void*p1, const void*p2)
{
     int y1;
     int y2;
     int x1;
     int x2;
     y1 = (*(position *)p1).y;
     y2 = (*(position *)p2).y;
     x1 = (*(position *)p1).x;
     x2 = (*(position *)p2).x;
     if(x1 >x2)
     {
         return1;
     }else if(x1 < x2){
         return-1;
     }else{
         if(y2< y1){
              return1;
         }else{
              return-1;
         }
     }
}
positionstation[maxNum];
positionagent[maxNum];
__int64 minDis;
struct coordinate{
     int pos;
     int x;
};
int findMinY(int begin, int end, int t)
{
     int y;
     int low,high, mid;
     low = begin;
     high = end - 1;
     while(low< high){
         mid = (low + high) / 2;
         if(t> station[mid].y){
              low = mid + 1;
         }else{
              high = mid;
         }
     }
     //现在有关系: t< station[high].y && t > station[high - 1].y
     y = station[high].y - t;
     //如果直接check[high+ 1].pos可能会越界,因为high有可能等于top
     if(high> begin && y > t - station[high - 1].y)
     {
         y = t - station[high - 1].y;
     }
     return y;
}
coordinatecheck[maxNum];
int top;
int N;
void cal(position now)
{
     int low,high, mid;
     int t;
     int x;
     int y;
     int temp;
     int begin;
     int end;
     int pos;
     __int64bigTemp;
     t = now.x;
     low = 0;
     high = top;
     while(low< high){
         mid = (low + high) / 2;
         if(t> check[mid].x){
              low = mid + 1;
         }else{
              high = mid;
         }
     }
     //现在有关系: t< check[high].x && t > check[high - 1].x
     x = check[high].x - t;
     begin = check[high].pos;
     end = high + 1;
     pos = high;
     //如果直接check[high+ 1].pos可能会越界,因为high有可能等于top
     if(high> 0 && x > t - check[high - 1].x)
     {
         pos = high - 1;
         x = t - check[pos].x;
         begin = check[pos].pos;
         end = high;
     }
     end = check[end].pos;
     //这下即使士兵的横坐标大于所有电站的横坐标,check也不可能越界了,
     //因为只要top不为(即电站数目不为,这是可以保证的),
     //就存在一个电站,使得电站与士兵的横坐标之差小于MAX - t的距离。
     y = findMinY(begin, end, now.y);
     bigTemp = ((__int64)x)* ((__int64)x)+ ((__int64)y)* ((__int64)y);
     if(minDis> bigTemp){
         minDis = bigTemp;
     }
 
     temp = pos - 1;
     while(temp>= 0){
         x = now.x - check[temp].x;
         bigTemp = ((__int64)x)* ((__int64)x);
         if(bigTemp> minDis)
         {
              break;
         }
         begin = check[temp].pos;
         end = check[temp + 1].pos;
         y = findMinY(begin, end, now.y);
         bigTemp += ((__int64)y)* ((__int64)y);
         if(minDis> bigTemp){
              minDis = bigTemp;
         }
         temp--;
     }
 
     temp = pos + 1;
     while(temp< top){
         x = check[temp].x - now.x;
         bigTemp = ((__int64)x)* ((__int64)x);
         if(bigTemp> minDis)
         {
              break;
         }
         begin = check[temp].pos;
         end = check[temp + 1].pos;
         y = findMinY(begin, end, now.y);
         bigTemp += ((__int64)y)* ((__int64)y);
         if(minDis> bigTemp){
              minDis = bigTemp;
         }
         temp++;
     }
}
int main()
{
#ifndef ONLINE_JUDGE    
     FILE *fin;
 
     fin = freopen("test.txt", "r", stdin);
     if( !fin )
     {
         printf("reopen in file failed...\n");  
         while(1){}
         return 0;
     }
     freopen("out.txt", "w", stdout);
#endif
     int cases;
     int i;
     int temp;
     scanf("%d",&cases);
     for(; cases> 0; cases--){
         scanf("%d",&N);
         for(i =0; i < N; i++){
              scanf("%d%d",&station[i].x, &station[i].y);
         }
         for(i =0; i < N; i++){
              scanf("%d%d",&agent[i].x, &agent[i].y);
         }
         qsort(station, N, sizeof(station[0]), cmp);
         top = 0;
         temp = -MAX;
         for(i =0; i < N; i++){
              if(temp!= station[i].x)
              {
                   temp = station[i].x;
                   check[top].x = temp;
                   check[top].pos = i;
                   top++;
              }
         }
         check[top].x = MAX;
         check[top].pos = N;
          //check设立的最后这个元素,有诸多好处
         minDis = __int64MAX;
         for(i =0; i < N; i++){
              cal(agent[i]);
         }
         //printf("%d\n",minDis);
         printf("%.3f\n",sqrt((double)minDis));
     }
#ifndef ONLINE_JUDGE  
//   fclose(stdout);
     fclose(stdin);
#endif
     return 1;
}
29.2    线段相交

关于线段相交,《算法艺术与信息学竞赛》介绍得比较细致。

29.2.1   实例

PKU JudgeOnline, 1039, Pipe.

29.2.2   问题描述

如上图所示,有一条管子,拐角处的两点坐标为(x, y)和(x, y + 1)。有一束光从入口射入,遇到管壁则被阻挡。求光所能达到的最大的x。

29.2.3   输入

4

01

22

41

64

6

01

2-0.6

5-4.45

7-5.57

12-10.8

17-16.55

0

29.2.4   输出

4.67

Through all the pipe.

29.2.5   分析

《算法艺术与信息学竞赛》对这个题有结题报告。
29.2.6   程序

#include <stdio.h>
#include <math.h>
 
typedef struct {
     double x,y;
}point;
int dblcmp (double d)    //判断d的符号
{
     if (fabs(d) < 1e-6) return 0;
     return (d> 0) ? 1 : -1;
}
void getline (point a, point b, double&k, double &t, double&c) 
{   //根据点a,b求直线kx+ty+c=0
     k = a.y - b.y;
     t = b.x - a.x;
     c = a.x*b.y - b.x*a.y;
     return ;
}
int cal (double k, doublet, double c, point a)
{//计算点a在直线kx+ty+c=0的上方还是下方还是直线上
     returndblcmp (k*a.x + t*a.y + c);
}
int n;
const int size = 21;
pointup[size], down[size];
double max;
void updata (double k, double t, double c,point a, point b)
{//更新最大值
     double k2,t2, c2;
     getline (a, b, k2, t2, c2);
     double xp =(t*c2 - t2*c) / (k*t2 - t*k2);
     if (xp >max)
     {
         max = xp;
     }
     return ;
}
bool judge (point a, point b)
{  // 判断点a,b构成的直线是否能通过整条管道
     double k,t, c;
     getline (a, b, k, t, c);
     //判断光线能够从第一个通道口射入
     if (cal(k,t, c, up[0]) * cal(k, t, c, down[0]) > 0) returnfalse;
     int i;
     //寻找第一个拐角,在这个拐角前,光线已穿越管壁
     for (i = 1;i < n; i++)
         if(cal(k, t, c, up[i]) * cal(k, t, c, down[i]) > 0) break;
     if (i == n)return true;
     if (cal(k,t, c, up[i]) * cal(k, t, c, up[i-1]) <= 0) updata (k, t, c, up[i], up[i-1]);
     if (cal(k,t, c, down[i]) * cal(k, t, c, down[i-1]) <= 0) updata (k, t, c, down[i],down[i-1]);
     return false;
}
bool solve ()
{
     for (int i = 0; i < n; i++)
         for (int j = 0; j < n; j++){
              if(i == j) continue;
              if(judge (up[i], down[j])) return true;
         }
     return false;
}
 
int main ()
{
//   freopen("in.txt", "r", stdin);
     while(scanf ("%d", &n), n){
         for (int i = 0; i < n; i++){
              scanf ("%lf%lf",&up[i].x, &up[i].y);
              down[i].x = up[i].x; down[i].y =up[i].y - 1;
         }
         max = up[0].x;
         if(solve ()) printf ("Through all thepipe.\n");
         elseprintf ("%.2f\n", max);
     }
}

29.3    Melkman在线凸包算法

《算法艺术与信息学竞赛》比较全面、生动地介绍了凸包算法及其应用。

Melkman凸包算法继承Graham-Scan算法的主要思想,并更近一步地采用双端队列,动态地在队列两头进行增删操作,维护“凸性”。

一个Melkman凸包算法的实例如下:

[ii]中描述的Melkman凸包算法如下所示:

1.  t ← 1; b ← 0;//这里似乎Melkman弄反了,应该改成:t ← 0;b ←1;

vl← input; v2 ← input; v3 ← input;

if (Vl, v2, v3) > 0

then begin push vl; push v2; end;

else begin push v2; push v1; end;

pushv3 ; insert v3;

2.   v ← input;

until (v, db, db+l) < 0 or (dt-1, dt, v) < 0

do v ← inputend;

3.   until (dt-l,dt, v) > 0 do pop dt end;

pushv;

4.  until(v, db, db+l) > 0 do remove db end;

insertv;

goto 2.

     其中定义:

(x, y, z)为根据z在x到y的向量右边、同一条直线上、或左边,而返回1, 0, -1的函数。

       push操作就是使得t = t + 1; dt = v。

     pop操作就是使得 t = t - 1。

       insert操作就是使得b = b - 1; db = v。

       remove操作就是使得b = b + 1。

29.3.1   实例

PKU JudgeOnline, 1113, Wall.

29.3.2   问题描述

已知N个点的坐标,要将这些点用围墙围起来,并使得围墙距离点的距离不超过L。求围墙的周长。输出四舍五入。

先输入N和L,然后是N个点的坐标。

1.3.3   输入

9100

200400

300400

300300

400300

400400

500400

500200

350200

200 200

29.3.4   输出

1628

29.3.5   分析

先求这些点的凸包。

可以很容易地证明:周长最短的围墙是由由于凸包的每条边,垂直向外平移L的距离,再将这些线段用半径为L的圆弧连接起来而构成的。

同时又很容易证明:这些圆弧的角度之和为360度。

故此这个问题直接转化为求凸包的周长问题。

凸包的求法中三点共线是十分需要注意的。Melkman算法描述中略去了对三点共线的许多细节的处理。

29.3.6   程序

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
#define maxNum     2010
#define BEGIN 1005
#define PI         3.1415926
struct Vector{
     int x;
     int y;
};
Vectord[maxNum];
inline int crossProduct(Vector p1,Vector p2)
{
     return p1.x* p2.y - p1.y * p2.x;
}
inline int fun(Vector v1,Vectorv2,Vector v3)
{
     Vector tempv1;
     Vector tempv2;
     tempv1.x = v2.x - v1.x;
     tempv1.y = v2.y - v1.y;
     tempv2.x = v3.x - v1.x;
     tempv2.y = v3.y - v1.y;
     returncrossProduct(tempv1, tempv2);
}
inline double dis(Vector p1, Vectorp2)
{
     double x;
     double y;
     x = p2.x - p1.x;
     y = p2.y - p1.y;
     x = x * x;
     y = y * y;
     returnsqrt(x + y);
}
inline int between(Vector p0,Vector p1, Vector p2)
{
     int x1;
     int x2;
     if(p1.x> p2.x){
         x1 = p1.x;
         x2 = p2.x;
     }else{
         x1 = p2.x;
         x2 = p1.x;
     }
     if(p0.x< x1 && p0.x > x2){
         return1;
     }else{
         return0;
     }
}
#define push(v)        t++;d[t]= v;
#define pop()      t--;
#define insert(v)  b--;d[b] =v;
#define remove()   b++;
int N;
void Melkman()
{
     int t;
     int b;
     int i;
     double sum;
     int temp;
     Vector v, v1, v2, v3;
     int L;
     cin >> L;
     cin >> v1.x >> v1.y;
     cin >> v2.x >> v2.y;
     cin >> v3.x >> v3.y;
     t = 0;
     b = 1;
     t += BEGIN;
     b += BEGIN;
     if(fun(v1,v2, v3) > 0){
         push(v1);
         push(v2);
     }else{
         push(v2);
         push(v1);
     }
     push(v3);
     insert(v3);
     for(i = 3;i < N; i++){
         cin >> v.x >> v.y;
         /*
         //如果有坐标相同的点,需要加入如下的判断
         for(j = b; j< t; j++){
              if(v.x ==d[j].x && v.y == d[j].y)
              {
                   //int*a = (int *)0;
                   //a =0;
                   break;
              }
         }
          if(j < t)
         {
              continue;
         }
         */
         //if(!(fun(v,d[b], d[b + 1]) < 0 || fun(d[t - 1], d[t], v) < 0))
//把共点的连同共线的都过滤了,过滤点的条件太松
         if((fun(v,d[b], d[b + 1]) > 0 && fun(d[t - 1], d[t], v) > 0))
//把共点的连同共线的都没过滤,过滤点的条件太紧
         {
//这里必须如此,不能是上面的,否则共线的出错
              continue;
         }
         if(fun(v,d[b], d[b + 1]) == 0 && fun(d[t - 1], d[t], v) == 0)
         {       
              if(between(v,d[b], d[b + 1]) || between(v, d[t - 1], d[t]))
              {
//这里进行的是将共线的,但是处在已得凸包边上的点滤除
                   continue;
              }
         }
         while(t- b >= 2 && fun(d[t - 1], d[t], v) <= 0){
//只要共线的都删除重新加了,直到只剩下两个点为止
              pop();
         //   cout<< "poped"<< endl;
         }
         push(v);
         while(t- b >= 2 && fun(v, d[b], d[b + 1]) <= 0){
//只要共线的都删除重新加了,直到只剩下两个点为止
              remove();
         //   cout<< "removed"<<endl;
         }
         insert(v);
     }
     sum = 0;
     for(i = b;i < t; i++){
         sum += dis(d[i], d[i + 1]);
     }
     sum += 2 * PI * L;
     temp = (int)sum;
     sum -= temp;
     if(sum>= 0.5)
     {
         temp++;
     }
     cout << temp << endl;
}
int main()
{   
     while(cin>> N){
         Melkman();
     }
}

29.4    实例

29.4.1   线段相交的实例

PKU JudgeOnline, 1039, Pipe.

29.4.2   凸包的实例

PKU JudgeOnline, 1113, Wall.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article


[i] Discrete Mathematics, Sixth Edition. Richard Johnsonbaugh.

[ii] On-line Construction of the Convex Hull of a Simple Polygon. MelkmanA. Information Processing Letters 25, p11-12 , (1987).

凸包melkman算法 cpp STL deque poj1113 melkman算法求凸包, 使用STL 立即下载

相关推荐

Melkmans-Algorithm-Visualized:对迷人算法的动态探索

Melkman 的算法可视化 找到简单多边形凸包的最佳方法的动态可视化。 要在本地运行,请执行npm install && browserify melkman.js -o bundle.js && wget http://d3js.org/d3.v3.js并打开您喜欢的Web服务器。 贡献 如果你发现了一块混乱的解释性文字,以改变它explanation.js并提交PR。 如果你有办法改善动态行为或图形,你应该提交一个问题,让我来处理它,而不是目睹melkman.js包含的洛夫克拉夫特式的恐怖。

平面最远点对

平面最近点对可以用分治法在O(n*log(n))时间内解决,平面最远点对可以用凸包+旋转卡壳在O(n*log(n))时间内解决。 不管是平面最近点对还是平面最远点对,问题都可以避免O(n*n)。但这两种算法都不能直接应用在高维空间。 POJ2187 题目链接:POJ2187 这道题不使用旋转卡壳,在求完凸包之后直接暴力也是可以通过的。 #include <math.h> #i...

1587

凸包melkman算法cpp

凸包melkman算法cpp实现,通过poj1113题测试

基于Graham扫描线算法的更加强大的凸包算法——Melkman算法

大家好,这里是蒟蒻霞客,thewalker88 今天我来给大家讲解一种OI中很少有人使用,然而在我看来比常用的Graham扫描线算法更为强大的算法——Mlekman算法 为了学习这个新算法,你需要如下前置技能: 1),会计算几何基础,尤其是叉积 2),掌握Graham扫描线算法求凸包 如果你不会如上前置技能,网上各路神犇的关于此的讲解很多,如果能够先点亮这些前置技能,理解这篇博客无疑会更...

thewalker88的博客 5808

Melkman凸包算法及Java实现

Melkman凸包算法及Java实现,以及相关文档资料

SAP HR模块配置假期日历和缺勤类型

SAP的HR模块。业务顾问在实施时一般会配置未来10年的假期日历,到期后再进行配置。同时,增加请假类型(缺勤信息类型)。记录这一过程。

福来阁86号技师的妖孽日常 5524

凸包及其在ACM算法中的应用

漫话二维凸包 http://221.179.130.210:83/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/read.pudn.com/downloads48/ebook/164515/geometry.pdf 1.  Graham 2.  贾维斯的礼物 1984 年,贾维斯(Jarvis)带来了一个求凸包的新算法,算法的执行过程就 是像在包礼

三少GG 3191

手把手教你用TP4056和PMOS管搭建锂电池自动切换电路(含元器件选型指南)

本文详细介绍了如何使用TP4056和PMOS管搭建锂电池自动切换电路,包括核心架构设计、元器件选型指南和PCB布局优化。通过智能充电算法和电源路径切换模块,实现外部供电与锂电池的无缝切换,提升便携式设备的电源管理效率。

julia4scientist的博客 890

基于C#的UG二次开发---凸包(Melkman算法实现)

网上关于凸包的算法还是挺多的,断断续续的学习并研究了一阵,现在对Melkman这个算法下手,号称解二维凸包的最强算法,大家都这么说,我也没资格怀疑。值得一提的是网上搜出来的Melkman算法全部是同一个模子刻出来的,即便是编程语言不一样,变量名、方法名等基本上没变化,嗯,前人造好的轮子后人标签都不得撕,说不上好歹,这个风我也跟了。 双端队列这个概念被高度用在Melkman算法中,对于这个概念我不是很了解,查了下资料更懵了。其实Melkman算法就用了双端队列的一个性质——两头都可以添加数据,仅此而已。完全可

huang233229920的博客 1027

Mcgs 屏幕Modbus RTU通讯调试

昆仑通态屏幕作为Modbus Master 与 Modbus Slave通过RS485接口实现通信的调试记录

madao1234的博客 5570

基于深度视觉实现机械臂对目标的识别与定位

Marker ID 和 Marker size 自选,在 launch 文件中做相应的修改(本教程演示使用 Marker ID:582,Marker size:30mm)根据相机和机械臂的安装方式不同,手眼标定分为眼在手上和眼在手外两种方式,双臂机器人的相机和机械臂基座的相对位置固定,所以应该采用眼在手外的手眼标定方式。后续的视觉引导机械臂抓取测试实验基于本实验实现,通过视觉引导右臂完成抓取目标物,所以默认已使用机械臂右臂和相机完成了手眼标定。文件,根据打印的marker 标签,需要配置。

realman_Rop的博客 3765

凸包问题的五种解法

前言: 首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图: 然后,什么是凸包问题? 我们把这些点放在二维坐标系里面,那么每个点都能用 (x,y) 来表示。 现给出点的数目13,和各个点的坐标。求构成凸包的点? 解一:穷举法(...

baningtao1470的博客 3413

海思ISP调优实战:从实验室到真实场景的IPC相机图像质量优化指南

本文深入探讨海思ISP调优在IPC相机图像质量优化中的实战应用,从实验室标定到真实场景部署的全链路调优方法。重点解决光照动态范围、色温变化和噪声特性等核心问题,提供AE权重表配置、CCM标定、3DNR时域滤波等关键技术方案,帮助实现从理论到实践的图像质量提升。

s3t4u的博客 750

实用算法实现-第 29 篇 计算几何学

29.1 最近点对 “最近”是指通常意义上的欧几里德距离。《算法导论》中对这个问题进行了介绍。[i]问对于经典的分治法求最近点对有深入的介绍和详尽的伪代码。 29.1.1实例 PKU JudgeOnline, 3714, Raid. 29.1.2问题描述 给定n个岗位和n个战士的坐标(0 ≤ X ≤1000000000, 0 ≤ Y ≤ 1000000000)。问这些战士当中,离某个岗位...

luotuoass 246

基于LORA的双机通信的智能农业系统

通过LoRa模块与主机进行通信,监测环境中的温度、湿度、土壤湿度和光照强度等参数,并根据预设的自动控制逻辑或者手动指令控制继电器开关,从而调节风扇、加热器、水泵、喷雾器和灯光等设备,为植物提供适宜的生长环境。使用的Lora是大夏龙雀的感觉这个是我使用过的Lora里面最好用的,因为不用设置频道就可以直接透明传输,使用起来得心应手。就像两个单片机直接串口通信一样,缺点是异步串行,不能同时进行接收和发送。继电器灯亮模拟打开对应的风扇、水泵、灯、喷雾、加热。1.使用温度传感器测当前环境的温湿度。

ssjsjss的博客 1739

《Autosar从入门到精通-实战篇》总目录_培训教程持续更新中...

欢迎大家订阅《Autosar从入门到精通-实战篇》,下方整理了相关博文的目录(单击蓝色字体即可跳转),方便大家获取。 本专栏旨在:扫除Autosar工具链配置过程中的障碍,加深对Autosar理论的理解。 温馨提醒: 如有疑问,可在博文的“评论区”给小编留言,进行技术交流(评论区开启了验证功能,审核通过后,会显示); 如有疑问,也可以通过博文中的第一个图片联系小编,获取专栏/博文的实时状态; 由于工作限制,仅做个人技术交流。添加好友时,请备注您的“姓名-公司-职务...

「汽车电子助手」的博客 12万+

欧几里得算法_著写流传2300年数学经典,被世人称为“几何学之父”——欧几里得...

欧几里得,有时被称为亚历山大里亚的欧几里得,以便区别于墨伽拉的欧几里得,希腊化时代的数学家,被称为“几何学之父”。他活跃于托勒密一世时期的亚历山大里亚,也是亚历山太学派的成员。他在著作《几何原本》中提出五大公设,成为欧洲数学的基础。欧几里得也写过一些关于透视、圆锥曲线、球面几何学及数论的作品。欧几里得几何被广泛的认为是数学领域的经典之作。节选自维基百科, [遇见数学] 有修改, 转载请注明.生平资...

weixin_39631649的博客 744

【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题

【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题

WW、forever的博客 711

计算几何算法概览

计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。 一、引言 计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人...

木牛的博客 1279

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

欧几里得算法_几何学之父:欧几里得

欧几里得,有时被称为亚历山大里亚的欧几里得,以便区别于墨伽拉的欧几里得,希腊化时代的数学家,被称为“几何学之父”。他活跃于托勒密一世时期的亚历山大里亚,也是亚历山太学派的成员。他在著作《几何原本》中提出五大公设,成为欧洲数学的基础。欧几里得也写过一些关于透视、圆锥曲线、球面几何学及数论的作品。欧几里得几何被广泛的认为是数学领域的经典之作。节选自维基百科, [遇见数学] 有修改, 转载请注...

weixin_39628063的博客 481

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

几何学小算法

目录 一 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 二 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4

凤凰翎箭 1226

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

计算几何

把草稿纸上的集合体转变成代码其中还是有很多细节问题需要注意的,《算法导论》主要介绍了叉积在几何学中的应用。向量的两个运算点积与叉积,点积:ab = |a||b|cos 叉积:a x b = |a||b|sin,由于叉积的形式与面积公式相似,也常用于计算多边形的面积,同时如果a x b > 0则a 向量在b向量的顺时针方向上,利用这个性质,《算法导论》介绍了凸包的求解方法。 HDU...

banmi9580的博客 149

数学与计算机科学国际研讨会怎么样,科学网—阿狗迎新──2018年算法数学国际学术会议预告 - 王东明的博文...

第13届人工智能与符号计算国际会议:人工智能与符号计算交叉融合13th International Conference on Artificial Intelligence and Symbolic ComputationAISC 2018,中国北京,2018年9月16日至19日http://aisc2018.cc4cm.org符号计算在人工智能领域的应用已获得巨大成功。已故数学泰斗吴文俊院士在...

weixin_29731589的博客 396

算法导论之计算几何学小记 33.1

在USACO上做题时发现要判断两线段是否相交,表示不会,别人说算导上就有,于是找来看看 第一节主要3个小问题 1.有向线段p0p1,p0p2,如何判断p0p1在p0p2的顺时针还是逆时针 方法叉积 (p1-p0)x(p2-p0)=(x1-x0)(y2-y0)-(x2-x0)(y1-y0) 若>0,p0p1在p0p2的顺时针.<0则逆 ==0则共线... 2.p0-p1 ,p...

weixin_30907523的博客 192

计算机算法导论第三版算法视频讲解

算法导论》第三版是一本深度与广度兼备的经典算法教材,它不仅适合作为大学教材,也是技术专业人士的宝贵参考书。点击链接,打开【快手】直接观看!这本书的价值不仅在于教授具体的算法,更在于培养读者算法思维和分析能力,这是计算机科学教育的核心目标之一。书名:Introduction to Algorithms(中文译名:算法导论)2 在线课程:Coursera、edX等平台有基于本书的算法课程。计算机算法导论第三版的免费视频,会陆续不断更新算法视频。2 准备面试:重点学习排序、数据结构、图算法等核心章节。

kupePoem的专栏 1067
上一篇: 实用算法实践-第 28 篇 素数判别
下一篇: 实用算法实践-第 30 篇 组合数学
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值