C语言平面几何
hbuxiaoshe
这个作者很懒,什么都没留下…
展开
-
在canvas中绘制箭头
canvas中没有提供绘制箭头的函数,需要自己手动绘制,幸好箭头并不复杂,简单来说箭头由三条线段组成,如下图所示,线段AB、BC和BD,关键在于在给定端点A和B的坐标情况下,如何计算点C和D的坐标。这里有两个思路可供参考,如下思路一,利用线段首先,在线段AB上确定一个点P,接着经过P点画一条直线与AB垂直,最后在直线P点两端确定C和D点。确定P点坐标,利用三角形相似得,计算得P的横坐标xp = xb - (xb-xa)*|BP|/|BA|,同样纵坐标yp = y...原创 2021-09-04 23:50:17 · 4672 阅读 · 0 评论 -
C语言平面几何17-角平分线
<br />角平分线的求解思路,如图,求∠ABC的角平分线:<br /><br />(1)在BC(或BC的延长线)上取一点D,使|AB|=|BD|。<br />(2)求线段AD的中点E,则直线BE即为∠ABC的角平分线。<br />点D的坐标可以根据三角形相似来求解,如x满足|BD|/|BC|=(D.x-B.x)/(C.x-B.x)。/* 角平分线,输入:角ABC<180度 */Line AngleBisector(Point A, Point B, Point C){ double ba =原创 2010-12-07 21:56:00 · 3523 阅读 · 1 评论 -
C语言平面几何12-向量方法判断线段与矩形是否有交集
<br />向量方法判断线段与矩形是否有交集,通过向量叉乘的结果正负来判断,当矩形在线段的某一侧时,叉乘的结果要么全正,要么全负,此时无交集。<br />判断有2步:1)快速排斥,2)叉乘。int RSIntersection(Rectangle r, Point A, Point B){ MBR m1 = (MBR)r; MBR m2 = MbrConstruct(A, B); // 快速排斥 if (MbrOverlap(m1, m2) == 0) return 0;原创 2010-10-17 11:40:00 · 2040 阅读 · 0 评论 -
C语言平面几何16-三角形的外心和外接圆
<br />三角形的外心,就是其外接圆的圆心。三角形三边的垂直平分线相交于一点,该点即为外心。/* 三角形的外心 */Point Excenter(Triangle t){ Line l1 = PerpendicularBisector(t.A, t.B); Line l2 = PerpendicularBisector(t.A, t.C); int flag; return LinesIntersection(l1, l2, &flag); // flag返回0,两直线平行}原创 2010-12-07 21:08:00 · 2718 阅读 · 0 评论 -
C语言平面几何18-三角形的内心和内切圆
<br />三角形的内心,就是其内切圆的圆心。三角形三内角平分线相交于一点,该点即为内心。/* 三角形的内心 */Point Incenter(Triangle t){ Line l1 = AngleBisector(t.A, t.B, t.C); Line l2 = AngleBisector(t.B, t.A, t.C); int flag; return LinesIntersection(l1, l2, &flag); // flag返回0,两直线平行}/* 三角原创 2010-12-07 22:03:00 · 2290 阅读 · 0 评论 -
C语言平面几何19-三角形的重心和垂心
<br />三角形的重心:三角形三条中线的交点。该交点到顶点的距离是到对边中点距离的2倍。<br />三角形的垂心:三角形三条高的交点。/* 三角形的重心 */Point BaryCenter(Triangle t){ // 三条中线的交点 Point m = MiddlePoint(t.B, t.C); Line l1 = LineMake(t.A, m); Point n = MiddlePoint(t.A, t.B); Line l2 = LineMake(t.C,原创 2010-12-11 21:31:00 · 3457 阅读 · 0 评论 -
C语言平面几何13-两直线的夹角
<br />平面几何中,两直线的夹角定义为两条直线所形成的不大于90度的角。<br />两直线夹角θ:<br />tgθ=|(k2-k1)/(1+k1*k2)|,k1、k2分别为两直线的斜率<br />直线A1x+B1y+C1=0和A2y+B2y+C2=0的夹角θ:<br />tgθ=|(A1B2-A2B1)/(A1A2+B1B2)|。<br />C语言代码:/* 两直线的夹角,返回角度值,非弧度值 */double IncludedAngle(Line m, Line n){ double v原创 2010-10-24 21:37:00 · 5363 阅读 · 0 评论 -
C语言平面几何15-线段的垂直平分线
线段AB的垂直平分线:先求中点M,再根据线段AB的斜率k1求出直线的斜率k2,k1*k2=-1,最后求出线段的方程:kx-y+C=0。/* 线段的垂直平分线 */Line PerpendicularBisector(Point A, Point B){ Point m; // 中点 m.x = (A.x + B.x)/2; m.y = (A.y + B.y)/2; Line l; if (dequals(A.y, B.y)) // 线段是水平的 { l.A原创 2010-10-26 22:10:00 · 3939 阅读 · 0 评论 -
C语言平面几何14-三角形的面积
<br />求三角形ABC的面积S。<br />1)S=底*高/2<br />2)S2=p*(p-a)*(p-b)*(p-c),其中p=(a+b+c)/2<br />C语言代码:/* 三角形的面积: 底*高/2 */double AreaOfTriangle(Triangle t){ Line l = LineMake(t.A, t.B); double d = DistanceOfPoints(t.A, t.B); double h = DistanceOfPointToLine(t.原创 2010-10-25 22:23:00 · 1367 阅读 · 0 评论 -
C语言平面几何11-点关于直线的对称点
求点P(x0, y0)关于直线Ax+Bx+C=0的对称点M(x1, y1),满足两个条件:(1)线段PM的中点在直线上(2)PM与直线垂直/* 点关于直线的对称点 */Point SymmetricalPoint(Point p, Line l){ Point s; double tmp = l.A * l.A + l.B * l.B; s.x = (l.B *l.B*p.x - l.A*l.A*p.x - 2*l.A*l.B*p.y - 2*l.A*l.C) / tmp; s.y原创 2010-09-24 16:20:00 · 3972 阅读 · 0 评论 -
C语言平面几何10-点到直线的垂点
求点A(x0, y0)到直线Ax+By+C=0的垂点B(x1, y1),满足两个条件:(1)Ax1+By1+C=0,点B在直线上(2)(y1-y0)/(x1-x0) * A/B=1,两线垂直,斜率k1 * k2 = -1。注:判断两直线垂直的方法有(1)A1A2+B1B2=0,(2)k1*k2 = -1。/* 计算点到直线的垂点 */Point VerticalPoint(Point p, Line l){ Point v; double tmp = l.A * l.A + l.B * l.原创 2010-09-16 21:29:00 · 4812 阅读 · 1 评论 -
C语言平面几何3-点是否在线段上
判断点P是否在线段AB上方法很多,这里给出两种。(1)通过距离判断,点P在线段AB上|AP|+|PB|=|AB|(2)通过向量叉积判断,点在线段上向量AP×向量AB=0,并且点P坐标在AB坐标之间C语言代码如下:/* 点是否在线段上: 距离判断 */int PointIsOnSegment(Point P, Point A, Point B){ double d1 = DistanceOfPoints(P, A); double d2 = DistanceOfPoints(P, B);原创 2010-08-19 21:10:00 · 3168 阅读 · 1 评论 -
C语言平面几何4-两线段是否相交
判断两线段是否相交:方法(1):快速排斥(两个MBR是否有交集)+跨立(一个线段的两个端点在另一线段的两端)。给出C语言代码如下:/* * 由两个点构造一个向量 */Vector VectorConstruct(Point A, Point B){ Vector v; v.x = B.x - A.x; v.y = B.y - A.y; return v;}// 向量的叉积double CrossProduct(Vector a, Vector b){原创 2010-08-19 22:15:00 · 4587 阅读 · 2 评论 -
C语言平面几何1-数据类型的定义
数学中的部分概念在C语言中的定义如下(注:为了与数学一致,有些参数使用了大写):/* 点 */typedef struct point{ double x; double y;}Point;/* 向量 */typedef Point Vector;/* 线段AB */typedef struct segment{ Point A; Point B;}Segment;/* 直线 * 直线方程一般式:Ax+By=C */typede原创 2010-08-17 21:01:00 · 2604 阅读 · 0 评论 -
C语言平面几何6-判断线段是否与矩形范围有交集
判断线段AB是否与矩形范围有交集这里的矩形指的是边与坐标轴平行的矩形,可用x和y上最大最小值表示。判断是否相交,先快速排斥,再做跨立,通过向量的叉积判断矩形的四个顶点是否在线段的两侧,是说明有交集。(如果判断与矩形的边是否有交集的话,可判断线段是否与矩形的每条边是否有交集,线段与线段的交集判断。)这里在介绍另外一种方法,降维的方法:例如,有线段AB和矩形MN,如图所示:通过M和N点的y坐标计算直线AB上的D和C点,B和C点中取y值小的点B,A和D点中取y值大的点D,最后确定了线段BD在x轴上的投影GH,矩形原创 2010-08-23 22:01:00 · 3171 阅读 · 0 评论 -
C语言平面几何5-两点确定一条直线
/* 两个不同点A,B确定一条直线,AB相同返回的值全0 * 直线方程:Ax+By+c=0 * A = y2 - y1; * B = x1 - x2; * C = -A*x1 - B*y1 = x2*y1 - x1*y2; */Line LineMake(Point A, Point B){ Line l; l.A = B.y - A.y; l.B = A.x - B.x; l.C = B.x * A.y - A.x * B.y; return l;原创 2010-08-20 21:03:00 · 4482 阅读 · 0 评论 -
C语言平面几何7-直线与圆的位置关系
直线与圆的位置关系有3种:1,相离,有0个交点2,相切,只有1个交点3,相交,有2个交点C语言代码如下:// 直线与圆的位置关系:0-相离,1-相切,2-相交int LineAndCircle(Line l, Circle c){ double d = DistanceOfPointToLine(c.centre, l); double r = c.radius; if (d > r) // 相离,交点为0 return 0; else if (d == r) // 相切,交点原创 2010-08-28 09:48:00 · 3616 阅读 · 0 评论 -
C语言平面几何8-两直线的位置关系
平面中,两直线不相交就平行,相交中又分垂直相交和非垂直相交,两直线重合可认为是特殊的平行。C语言代码如下:/* 两直线的关系 * 平面中,两直线不相交就平行 */int TwoLines(Line m, Line n){ // 平行:A1/B1 = A2/B2 if (m.A * n.B == m.B * n.A) { // 两直线斜率相同 if (m.C * n.B == m.B * n.c) return 1; // 重合 else ret原创 2010-09-09 22:36:00 · 1784 阅读 · 0 评论 -
C语言平面几何9-两直线的交点
求平面中两直线的交点,当两直线不平行时,必定只有一个交点。/* 返回两直线的交点 */Point LinesIntersection(Line m, Line n, int *flag){ double d = n.A * m.B - m.A * n.B; if (d == 0) { *flag = 0; return; } Point i; i.x = (n.B * m.C - m.B * n.C) / d; i.y = (m.A * n.C - n.A *原创 2010-09-16 20:14:00 · 3819 阅读 · 0 评论 -
C语言-向量基本概念
向量:既有大小又有方向的量叫向量。向量的模:向量的长度称为向量的模,用符号| |表示。零向量:长度为0的向量单位向量:长度为1的向量平面中,设有向量a={x1, y1},向量b={x2, y2},则有(1) 向量的加:a+b={x1+x2, y1+y2}(2) 向量的减:a-b={x1-x2, y1-y2}(3) 向量的点积(内积):a·b=|a|*|b|*cosθ=x1*x2 + y1*y2(4) 向量的叉积(外积):a×b=x1*y2 - x2*y1注:文原创 2010-08-15 09:42:00 · 18951 阅读 · 0 评论