⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myline2.cpp

📁 7. 求矢量夹角余弦 8. 求线段之间的夹角 9. 判断线段是否相交10.判断线段是否相交但不交在端点处 11.求线段所在直线的方程 12.求直线的斜率 13.求直线的倾斜角14.求点关于某直线的对称
💻 CPP
字号:
#include "mypoint.h"
 
/* 返回两个矢量l1和l2的夹角的余弦(-1 --- 1)注意:如果想从余弦求夹角的话,注意反余弦函数的定义域是从 0到pi */ 
double cosine(LINESEG l1,LINESEG l2) 
{ 
	return (((l1.e.x-l1.s.x)*(l2.e.x-l2.s.x) + 
	(l1.e.y-l1.s.y)*(l2.e.y-l2.s.y))/(dist(l1.e,l1.s)*dist(l2.e,l2.s))) ); 
} 
// 返回线段l1与l2之间的夹角 单位:弧度 范围(-pi,pi) 
double lsangle(LINESEG l1,LINESEG l2) 
{ 
	POINT o,s,e; 
	o.x=o.y=0; 
	s.x=l1.e.x-l1.s.x; 
	s.y=l1.e.y-l1.s.y; 
	e.x=l2.e.x-l2.s.x; 
	e.y=l2.e.y-l2.s.y; 
	return angle(o,s,e); 
} 
// 如果线段u和v相交(包括相交在端点处)时,返回true 
//
//判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
//判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。
bool intersect(LINESEG u,LINESEG v) 
{ 
	return( (max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&&                     //排斥实验 
			(max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&& 
			(max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&& 
			(max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&& 
			(multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&&         //跨立实验 
			(multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0)); 
} 
//  (线段u和v相交)&&(交点不是双方的端点) 时返回true    
bool intersect_A(LINESEG u,LINESEG v) 
{ 
	return	((intersect(u,v))&& 
			(!online(u,v.s))&& 
			(!online(u,v.e))&& 
			(!online(v,u.e))&& 
			(!online(v,u.s))); 
} 
// 线段v所在直线与线段u相交时返回true;方法:判断线段u是否跨立线段v  
bool intersect_l(LINESEG u,LINESEG v) 
{ 
	return multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0; 
} 
// 根据已知两点坐标,求过这两点的直线解析方程: a*x+b*y+c = 0  (a >= 0)  
LINE makeline(POINT p1,POINT p2) 
{ 
	LINE tl; 
	int sign = 1; 
	tl.a=p2.y-p1.y; 
	if(tl.a<0) 
	{ 
		sign = -1; 
		tl.a=sign*tl.a; 
	} 
	tl.b=sign*(p1.x-p2.x); 
	tl.c=sign*(p1.y*p2.x-p1.x*p2.y); 
	return tl; 
} 
// 根据直线解析方程返回直线的斜率k,水平线返回 0,竖直线返回 1e200 
double slope(LINE l) 
{ 
	if(abs(l.a) < 1e-20)
		return 0; 
	if(abs(l.b) < 1e-20)
		return INF; 
	return -(l.a/l.b); 
} 
// 返回直线的倾斜角alpha ( 0 - pi) 
double alpha(LINE l) 
{ 
	if(abs(l.a)< EP)
		return 0; 
	if(abs(l.b)< EP)
		return PI/2; 
	double k=slope(l); 
	if(k>0) 
		return atan(k); 
	else 
		return PI+atan(k); 
} 
// 求点p关于直线l的对称点  
POINT symmetry(LINE l,POINT p) 
{ 
   POINT tp; 
   tp.x=((l.b*l.b-l.a*l.a)*p.x-2*l.a*l.b*p.y-2*l.a*l.c)/(l.a*l.a+l.b*l.b); 
   tp.y=((l.a*l.a-l.b*l.b)*p.y-2*l.a*l.b*p.x-2*l.b*l.c)/(l.a*l.a+l.b*l.b); 
   return tp; 
} 
// 如果两条直线 l1(a1*x+b1*y+c1 = 0), l2(a2*x+b2*y+c2 = 0)相交,返回true,且返回交点p  
bool lineintersect(LINE l1,LINE l2,POINT &p) // 是 L1,L2 
{ 
	double d=l1.a*l2.b-l2.a*l1.b; 
	if(abs(d)<EP) // 不相交 
		return false; 
	p.x = (l2.c*l1.b-l1.c*l2.b)/d; 
	p.y = (l2.a*l1.c-l1.a*l2.c)/d; 
	return true; 
} 
// 如果线段l1和l2相交,返回true且交点由(inter)返回,否则返回false 
bool intersection(LINESEG l1,LINESEG l2,POINT &inter) 
{ 
	LINE ll1,ll2; 
	ll1=makeline(l1.s,l1.e); 
	ll2=makeline(l2.s,l2.e); 
	if(lineintersect(ll1,ll2,inter)) 
		return online(l1,inter); 
	else 
		return false; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -