今天偷懒了,一直没写博客。
为了保持“每天一篇”的更新,发一点上课用的东西:我们ICPC自己的Library,用来做Computation Geometry题目的。
主要包含:基本的点、线、圆、三角形、多边形的关系,以及两个很有用的算法:线切割多边形; Convex Hall -- 找出n个点所形成的最外围的凸多边形。
代码见下:(本来想直接上传的,但要压缩一遍才行太麻烦了)
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <list>
#include <cmath>
#define EPS 1e-100
#define PI 3.1415926535897932384626433832795028841971693993
#define DEG_to_RAD(X) (X * PI / 180)
#define RAD_to_DEG(X) (X / PI * 180)
#define CIR_INSIDE 0
#define CIR_BORDER 1
#define CIR_OUTSIDE 2
#define TRI_NONE 0
#define TRI_ACUTE 1
#define TRI_RIGHT 2
#define TRI_OBTUSE 3
using namespace std;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
typedef map<int,int> mii;
struct Point_i{
int x; int y;
Point_i(int _x, int _y){ x = _x; y = _y;}
};
struct Point{
double x,y;
Point(){ }
Point(double _x, double _y){
x = _x; y = _y;
}
bool operator < (const Point other) const{
if(fabs(x - other.x) > EPS) return x < other.x;
return y < other.y;
}
bool operator == (const Point other) const{
return (fabs(x - other.x) < EPS && (fabs(y - other.y) < EPS));
}
struct Point* operator = (const Point *other){
x = other->x; y = other->y;
return this;
}
};
struct Circle{
Point c;
double r;
Circle(Point _c, double _r){
c = _c; r = _r;
}
Circle* operator = (const Circle *oth){
c = oth->c; r = oth->r;
return this;
}
};
bool areSame(Point_i p1, Point_i p2){
return p1.x == p2.x && p1.y == p2.y;
}
bool areSame(Point p1, Point p2){
return fabs(p1.x - p2.x) < EPS && fabs(p1.y - p2.y) < EPS;
}
double dist(Point p1, Point p2){
return hypot(p1.x - p2.x, p1.y - p2.y);
}
Point rotate(Point p, double theta){
double rad = DEG_to_RAD(theta);
return Point(p.x * cos(rad) - p.y * sin(rad),
p.x * sin(rad) + p.y * cos(rad));
}
// ax + by + c = 0
struct Line{
double a,b,c;
const bool operator<(Line x) const{
if(abs(a - x.a) > EPS) return a < x.a;
if(abs(b - x.b) > EPS) return b < x.b;
if(abs(c - x.c) > EPS) return c < x.c;
return false; // when it's equal
}
};
void PointsToLine(Point p1, Point p2, Line *l){
if(p1.x == p2.x){
l->a = 1.0; l->b = 0.0; l->c = -p1.x;
} else{
l->a = -(double)(p1.y - p2.y) / (p1.x - p2.x);
l->b = 1.0;
l->c = -(double)(l->a * p1.x) - (l->b * p1.y);
}
}
bool areParallel(Line l1, Line l2){
return (fabs(l1.a - l2.a) < EPS) && (fabs(l1.b-l2.b) < EPS);
}
bool areSame(Line l1, Line l2){
return areParallel(l1,l2) && (fabs(l1.c - l2.c) < EPS);
}
bool areIntersect(Line l1, Line l2,Point *p){
if(areSame(l1,l2)) return false;
if(areParallel(l1,l2)) return false;
p->x = (l2.b * l1.c - l1.b * l2.c) / (l2.a * l1.b - l1.a * l2.b);
if(fabs(l1.b) > EPS){
p->y = -(l1.a * p->x + l1.c) / l1.b;
} else{
p->y = -(l2.a * p->x + l2.c) / l2.b;
}
return true;
}
// returs the distance from p to the Line defined by
// two Points A and B ( A and B must bedifferent)
// the closest Point is stored in the 4th parameter (by reference)
double distToLine(Point p, Point A,Point B, Point *c){
double scale = (double)
((p.x - A.x) * (B.x - A.x) + (p.y - A.y) * (B.y - A.y)) /
((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
c->x = A.x + scale * (B.x - A.x);
c->y = A.y + scale * (B.y - A.y);
return dist(p, *c);
}
double distToLineSegment(Point p, Point A,Point B, Point *c){
if( (B.x - A.x) * (p.x - A.x) + (B.y - A.y) * (p.y - A.y) < EPS){
c->x = A.x; c->y = A.y;
return dist(p,A);
}
if( (A.x - B.x) * (p.x - B.x) + (A.y - B.y) * (p.y - B.y) < EPS){
c->x = B.x; c->y = B.y;
return dist(p,B);
}
return distToLine(p,A,B,c);
}
// The cross product of pq,pr
double crossProduct(Point p, Point q, Point r){
return (r.x - q.x) * (p.y - q.y) - (r.y - q.y) * (p.x - q.x);
}
// returns true if Point r is on the same Line as the Line pq
bool colinear(Point p, Point q,Point r){
return fabs(crossProduct(p,q,r)) < EPS;
}
bool ccw(Point p, Point q, Point r){
return crossProduct(p,q,r) > 0;
}
struct vec{
double x, y;
vec(double _x, double _y){ x = _x, y = _y;}
};
vec toVector(Point p1, Point p2){
return vec(p2.x - p1.x, p2.y - p1.y);
}
vec scaleVector(vec v, double s){
return vec(v.x * s, v.y * s);
}
Point translate(Point p, vec v){
return Point(p.x + v.x, p.y + v.y);
}
bool Point_sort_x(Point a, Point b){
if( fabs(a.x - b.x) < EPS) return a.y < b.y;
return (a.x < b.x);
}
/* Circles */
// int version
int inCircle(Point_i p, Point_i c, int r){
int dx = p.x - c.x, dy = p.y - c.y;
int Euc = dx * dx + dy * dy, rSq= r * r;
return Euc < rSq ? CIR_INSIDE : Euc == rSq ? CIR_BORDER : CIR_OUTSIDE;
}
// float version
int inCircle(Point p, Point c, int r){
double dx = p.x - c.x, dy = p.y - c.y;
double Euc = dx * dx + dy * dy, rSq= r * r;
return (Euc - rSq < EPS) ? CIR_BORDER : Euc < rSq ? CIR_INSIDE : CIR_OUTSIDE;
}
bool circle2PtsRad(Point p1, Point p2, double r, Point *c){
double d2 = (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
double det = r * r / d2 - 0.25;
if(det < 0) return false;
double h = sqrt(det);
c->x = (p1.x + p2.x) * 0.5 + (p1.y - p2.y) * h;
c->y = (p1.y + p2.y) * 0.5 + (p2.x - p1.x) * h;
return true;
}
double gcDistance(double pLat, double pLong,
double qLat, double qLong, double radius) {
pLat *= PI / 180; pLong *= PI / 180;
qLat *= PI / 180; qLong *= PI / 180;
return radius * acos(cos(pLat)*cos(pLong)*cos(qLat)*cos(qLong) +
cos(pLat)*sin(pLong)*cos(qLat)*sin(qLong) +
sin(pLat)*sin(qLat));
}
/* Triangle */
// Find the trigangle type based on the arr of points given
int findTriangleType(Point arr[]){
double res = crossProduct(arr[0],arr[1],arr[2]);
if(fabs(res) < EPS) return TRI_RIGHT;
else if(res < 0) return TRI_OBTUSE;
res = crossProduct(arr[1],arr[0],arr[2]);
if(res < EPS){
swap(arr[0],arr[1]);
if(fabs(res) < EPS) return TRI_RIGHT;
return TRI_OBTUSE;
}
res = crossProduct(arr[2],arr[0],arr[1]);
if(res < EPS){
swap(arr[0],arr[1]);
if(fabs(res) < EPS) return TRI_RIGHT;
return TRI_OBTUSE;
}
return TRI_ACUTE;
}
double perimeter(double ab, double bc, double ca) {
return ab + bc + ca; }
double perimeter(Point a, Point b, Point c) {
return dist(a, b) + dist(b, c) + dist(c, a); }
double area(double ab, double bc, double ca) {
// Heron's formula, split sqrt(a * b) into sqrt(a) * sqrt(b); in implementation
double s = 0.5 * perimeter(ab, bc, ca);
return sqrt(s) * sqrt(s - ab) * sqrt(s - bc) * sqrt(s - ca); }
double area(Point a, Point b, Point c) {
return area(dist(a, b), dist(b, c), dist(c, a)); }
double rInCircle(double ab, double bc, double ca) {
return area(ab, bc, ca) / (0.5 * perimeter(ab, bc, ca)); }
double rInCircle(Point a, Point b, Point c) {
return rInCircle(dist(a, b), dist(b, c), dist(c, a)); }
double rCircumCircle(double ab, double bc, double ca) {
return ab * bc * ca / (4.0 * area(ab, bc, ca)); }
double rCircumCircle(Point a, Point b, Point c) {
return rCircumCircle(dist(a, b), dist(b, c), dist(c, a)); }
bool canFormTriangle(double a, double b, double c) {
return (a + b > c) && (a + c > b) && (b + c > a); }
/* Polygon */
double perimeter(vector<Point> P){
double result = 0.0;
for(int i=0;i<P.size()-1;i++){
result += dist(P[i],P[i+1]);
}
return result;
}
double polygonArea(vector<Point> P){
double result = 0, x1, y1, x2, y2;
for(int i=0;i<P.size()-1;i++){
x1 = P[i].x; x2 = P[i+1].x;
y1 = P[i].y; y2 = P[i+1].y;
result += (x1 * y2 - x2 * y1);
}
return fabs(result) / 2.0;
}
bool isConvex(vector<Point> P){
int sz = (int) P.size();
if(sz < 3) return false;
bool isLeft = ccw(P[0], P[1], P[2]);
for(int i=1; i<(int)P.size();i++){
if(ccw(P[i],P[(i+1)%sz],P[(i+2)%sz]) != isLeft) return false;
}
return true;
}
double angle(Point a, Point b, Point c){
double ux = b.x - a.x, uy = b.y - a.y;
double vx = c.x - a.x, vy = c.y - a.y;
return acos( (ux * vx + uy*vy) / sqrt((ux*ux + uy*uy) * ( vx*vx + vy*vy)));
}
bool inPolygon(Point p, vector<Point> P){
if(P.size() == 0) return false;
double sum = 0;
for(int i=0;i<P.size() -1; i++){
if(crossProduct(p,P[i],P[i+1]) < 0) sum -= angle(p,P[i],P[i+1]);
else sum += angle(p,P[i],P[i+1]);
}
return (fabs(sum - 2*PI) < EPS || fabs(sum + 2*PI) < EPS);
}
Point lineIntersectSeg(Point p, Point q, Point A, Point B){
double a = B.y - A.y;
double b = A.x - B.x;
double c = B.x * A.y - A.x * B.y;
double u = fabs(a*p.x + b*p.y + c);
double v = fabs(a*q.x + b*q.y + c);
return Point((p.x*v + q.x*u) / (u+v), (p.y*v + q.y*u) / (u+v));
}
// cuts polygon Q along the line formed by point a -> point b
// (note: the last point must be the same as the first point)
vector<Point> cutPolygon(Point a, Point b, vector<Point> Q) {
vector<Point> P;
for (int i = 0; i < (int)Q.size(); i++) {
double left1 = crossProduct(a, b, Q[i]), left2 = 0.0;
if (i != (int)Q.size() - 1) left2 = crossProduct(a, b, Q[i + 1]);
if (left1 > -EPS) P.push_back(Q[i]);
if (left1 * left2 < -EPS)
P.push_back(lineIntersectSeg(Q[i], Q[i + 1], a, b));
}
if (P.empty()) return P;
if (fabs(P.back().x - P.front().x) > EPS ||
fabs(P.back().y - P.front().y) > EPS)
P.push_back(P.front());
return P; }
Point pivot(0, 0);
bool angle_cmp(Point a, Point b) { // angle-sorting function
if (colinear(pivot, a, b))
return dist(pivot, a) < dist(pivot, b); // which one is closer?
double d1x = a.x - pivot.x, d1y = a.y - pivot.y;
double d2x = b.x - pivot.x, d2y = b.y - pivot.y;
return (atan2(d1y, d1x) - atan2(d2y, d2x)) < 0; }
vector<Point> CH(vector<Point> P) {
int i, N = (int)P.size();
if (N <= 3) return P; // special case, the CH is P itself
// first, find P0 = point with lowest Y and if tie: rightmost X
int P0 = 0;
for (i = 1; i < N; i++)
if (P[i].y < P[P0].y ||
(P[i].y == P[P0].y && P[i].x > P[P0].x))
P0 = i;
// swap selected vertex with P[0]
Point temp = P[0]; P[0] = P[P0]; P[P0] = temp;
// second, sort points by angle w.r.t. P0, skipping P[0]
pivot = P[0]; // use this global variable as reference
sort(++P.begin(), P.end(), angle_cmp);
// third, the ccw tests
Point prev(0, 0), now(0, 0);
stack<Point> S; S.push(P[N - 1]); S.push(P[0]); // initial
i = 1; // and start checking the rest
while (i < N) { // note: N must be >= 3 for this method to work
now = S.top();
S.pop(); prev = S.top(); S.push(now); // get 2nd from top
if (ccw(prev, now, P[i])) S.push(P[i++]); // left turn, ACC
else S.pop(); // otherwise, pop until we have a left turn
}
vector<Point> ConvexHull; // from stack back to vector
while (!S.empty()) { ConvexHull.push_back(S.top()); S.pop(); }
return ConvexHull; } // return the result
int main(){
return 0;
}
哦,对了。我把自己做UVA题目的情况放到了网上,开源的:http://code.google.com/p/songyy-uva-problems/。
有兴趣的话可以去看看:)
分享到:
相关推荐
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
Matlab遗传优化算法等算法 求解 生鲜配送问题 路径优化 时间窗 新鲜度 损成本 等约束 程序+算法+参考文献
计算机组成原理课程设计任务书 2021-3-1修订版1
单向辐射ugr模型 包含单向辐射电场模,上下表面辐射损耗,能带,q因字。
光伏锂电池储能功率协调控制系统仿真 [1]左侧光伏Boost控制部分:采用扰动观察法来进行MPPT最大功率跟踪,其中可以改变光照和温度模拟环境工况阶跃: [2]锂电池双向Buck_Boost:采用双闭环控制策略,给定负载电压外环,电流内环,通过稳定负载电压从而控制电流进行充放电 [3]负载电压能够稳定在设定值48V,锂离子电池对功率进行功率协调补偿 仿真运行工况模式: (1)当外界光照变弱,光伏输出功率不能满足负载所需功率,储能会放电进行补偿功率 (2)当外界光照变强,光伏输出功率超过负载所需功率,多余的功率储能会充电进行储存
激光熔覆数值模拟 COMSOL仿真 双椭球热源 采用双椭球热源模型,考虑材料热物性参数、相变、马兰戈尼效应、布辛涅斯克近似等,动网格模拟熔覆层,计算瞬态温度场和流场。
multisim学习Multisim2001电路设计及仿真入门与应用附带光盘含大量实例提取方式是百度网盘分享地址
HFI高频注入仿真 直接转矩控制,滑模观测器MATLAB仿真模型
拿来就用的张定友标定法实验报告,特别详细和完整 一、实验目的 3 二、实验器材 3 三、 张正友标定法原理 3 四、实验步骤 4 4.1 整体流程 4 4.2图像采集 4 4.3特征点提取 5 4.4相机标定 5 4.5畸变校正 6 五、 实验结果 6 5.1 内参矩阵K 6 5.2 畸变系数D 7 5.3 外参矩阵 和 7 5.4 标定误差的计算 8 六、实验结论 9 6.1标定结果的准确性与图像数量密切相关 9 6.2标定图像的分布与角度多样性对标定结果的影响 9 6.3重投影误差的评估 9 6.4畸变系数的准确性 9 6.5OpenCV 工具的使用简便性: 9 七、参考文献 10 八、附件 11
内容概要:本篇文章基于 Flask 框架讲解了一个具体的 API 接口实现方法,该接口用于触发特定ID关联的应用程序运行流程(利用Docker容器执行指定的应用Python脚本)。具体地,在接收 POST 请求之后,根据提供的应用ID来检索对应应用程序的相关路径、镜像名称与主脚本的位置等信息,并且尝试将应用程序目录及其相关联的数据目录挂载进一个临时创建出来的docker环境内以运行主要入口脚本,整个执行过程限定在一小时内完成。一旦成功则把结果以 JSON 包的形式发送回客户端,若是出现错误情况,如找不到对应的 App 或者在执行时发生异常或是超出了时限都将给予相应的JSON报错回复。 适用人群:有一定网络编程以及 Flask 框架使用基础的人群,特别是有志于深入研究 Python 网络服务器构建,掌握如何集成外部组件或容器化应用程序来提升业务处理能力的学生或者是工程师。 使用场景及目标:为用户提供一种简易但实用的方式让 Flask Web 应用可以异步地调用位于远端或本地机器上的 Docker 容器内的脚本来开展某些任务,如进行长时间的数据处理作业或是调用第三方工具等。
HFI高频方波注入方案stm32f405 无感FOC控制 直接闭环启动 永磁同步电机无感控制,0速带载启动,堵转保持扭矩 低速HFI, 高速SMO,全速域运行。 基于stm32f405。 高频注入零速启动三步走: 1 .先是高频注入,角度估算收敛。 2.脉冲NS磁极辨识。 3 .角度,速度双闭坏零速启动运行。 包括完整的cubemx配置文件,mdk工程,原理图和开发笔记,初始角度检测仿真,代码全C语言,宏定义选项均有中文注释,方便我植到自己的项目中。 内涵升级版hfi程序和新的foc程序框架,新版hfi程序速度波动更小。
数据来源:基于上市公司公告、年报等相关数据整理计算 数据范围:沪深京上市公司A股,包括主板、中小企业板、创业板、科创板、北京证交所服务板块等 数据详情: https://blog.csdn.net/yushibing717/article/details/144893810 包含六大类数据: 1、上市公司研究报告发布机构关联表20010101-20240929: ReportID [研究报告编码] - 自动生成的一组序列 Title [标题] - 研究报告的标题 DeclareDate [发布日期] - 研报对外发布日期 InstitutionName [发布机构名称] - 如果一个研报对应多个发布机构,分多条录入 2、上市公司研究报告分类关联表20010101-20240929: 3、上市公司研究报告基本信息20010101-20240929 4、上市公司研究报告人员关联表20010101-20240929 5、上市公司研究报告行业关联表20060703-20240929 上市公司研究报告证券关联表20010101-20240929.......
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
GEC6818 人脸检测
基于STM8单片机的编程实例,可供参考学习使用,希望对你有所帮助
内容概要:本文档是一份详尽的轨道交通信号与控制专业的综合实验指导手册,涵盖了五个主要实验项目,旨在帮助学生深入理解和实践轨道交通领域的关键技术。具体内容包括ZPW-Z000轨道电路信号的FSK调制与解调、机车信号噪声干扰、应答器报文编制与CRC校验。每个实验详细介绍了目的、原理、任务及实验步骤,同时提供了实验报告要求。通过这些实验,学生们能够全面了解和掌握轨道交通信号系统的工作机制和核心技术。 适用人群:高等院校电气与控制工程学院的本科生、研究生,以及从事轨道交通信号与控制系统研究的技术人员。 使用场景及目标:适用于课堂教学、实验课程和研究项目,帮助学生和研究人员掌握轨道电路信号的FSK调制与解调技术,理解噪声对机车信号的影响及应对措施,熟悉应答器报文的设计与CRC校验机制。目标是提高学生的动手能力、实验技能和理论素养,培养他们解决实际问题的能力。 其他说明:该实验手册不仅为学生提供了详细的实验指南,还为教师和实验技术人员提供了一套科学的教学和实验工具,有助于提升教学质量。同时,这些实验也为未来的研究和发展打下了坚实的基础。
基于 OpenCV 和 Angular Velocity 读数的高精度算法,该算法可以从五个不同的视频中重现汽车的方向盘角度。
简易高考志愿填报辅助工具(含源码与说明).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!