• 已知圆上三点坐标求圆心
千次阅读
2016-01-20 14:51:11
//求圆心坐标
getCenterPos:function(x1,y1,x2,y2,x3,y3){
var a=2*(x2-x1);
var b=2*(y2-y1);
var c=x2*x2+y2*y2-x1*x1-y1*y1;
var d=2*(x3-x2);
var e=2*(y3-y2);
var f=x3*x3+y3*y3-x2*x2-y2*y2;
var x=(b*f-e*c)/(b*d-e*a);
var y=(d*c-a*f)/(b*d-e*a);
cc.log("x:"+x+"y:"+y);
r=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1));//半径
},

更多相关内容
• 计算圆弧夹角算法/** 计算三点圆弧各夹角* @p1 p2 p3 三个点，圆弧方向按照经过点p1p2p3的顺序* @return 返回三个值， 分别表示两两之间的夹角*/Vector3d getArcAngle(Vector3d p1, Vector3d p2, Vector3d p3, ...

计算圆弧夹角算法

/** 计算三点圆弧各夹角

* @p1 p2 p3 三个点，圆弧方向按照经过点p1p2p3的顺序

* @return 返回三个值， 分别表示两两之间的夹角

*/

Vector3d getArcAngle(Vector3d p1, Vector3d p2, Vector3d p3, Vector3d pc)

{

Vector3d p1c = p1 - pc;

Vector3d p2c = p2 - pc;

Vector3d p3c = p3 - pc;

double cosTheta = p1c.dot(p3c) / (Abs(p1c) * Abs(p3c));

if (cosTheta >= 1) {

cosTheta = 1;

} else if (cosTheta <= -1) {

cosTheta = -1;

}

double theta = acos(cosTheta);

double cosTheta1 = p1c.dot(p2c) / (Abs(p1c) * Abs(p2c));

if (cosTheta1 >= 1) {

cosTheta1 = 1;

} else if (cosTheta1 <= -1) {

cosTheta1 = -1;

}

double theta1 = acos(cosTheta1);

if (((p2 - p1).cross(p3 - p2).normalized()).dot(

(p1c.cross(p3 - p1)).normalized()) < 0) {

theta = theta - 2 * pi;

//再判断第一个点的夹角是否大于180

if ((p1c.cross(p2c)).dot(p1c.cross(p3c)) > 0) {

theta1 -= 2 * pi;

}

}

double theta2 = theta - theta1;

Vector3d v(theta, theta1, theta2);

return v;

}

圆弧位置插补算法

/*

* 圆弧轨迹位置插补

* @p1 圆弧起点

* @p2 圆弧中点

* @p3 圆弧终点

* @t 中间点系数

* @return 返回中间的位置坐标

*/

Vector3d circlePositionInterpolation(Vector3d p1, Vector3d p2, Vector3d p3, double t)

{

double pNorm = Abs((p1 - p2).cross(p2 - p3));

double R = (Abs(p1 - p2)*Abs(p2 - p3)*Abs(p3 - p1)) / (2.0 * pNorm);

double alfa = ((Abs(p2 - p3)*Abs(p2 - p3)) * ((p1 - p2).dot(p1 - p3))) / (2 * pNorm*pNorm);

double beta = ((Abs(p1 - p3)*Abs(p1 - p3)) * ((p2 - p1).dot(p2 - p3))) / (2 * pNorm*pNorm);

double gama = ((Abs(p1 - p2)*Abs(p1 - p2)) * ((p3 - p1).dot(p3 - p2))) / (2 * pNorm*pNorm);

Vector3d pc = alfa * p1 + beta * p2 + gama * p3;

Vector3d p1c = p1 - pc;

Vector3d p2c = p2 - pc;

Vector3d p3c = p3 - pc;

double cosTheta = p1c.dot(p3c) / (Abs(p1c)*Abs(p3c));

if (cosTheta >= 1) {

cosTheta = 1;

} else if (cosTheta <= -1) {

cosTheta = -1;

}

double theta = acos(cosTheta);

double cosTheta1 = p1c.dot(p2c) / (Abs(p1c)*Abs(p2c));

if (cosTheta1 >= 1) {

cosTheta1 = 1;

} else if (cosTheta1 <= -1) {

cosTheta1 = -1;

}

double theta1 = acos(cosTheta1);

if (((p2 - p1).cross(p3 - p2).normalized()).dot((p1c.cross(p3 - p1)).normalized()) < 0) {

theta = theta - 2*pi;

//再判断第一个点的夹角是否大于180

if ((p1c.cross(p2c)).dot(p1c.cross(p3c)) > 0) {

theta1 -= 2*pi;

}

}

Vector3d temp;

if (theta == pi) {

temp = p1c.cross(p2c).cross(p1c);

} else {

temp = p1c.cross(p3c).cross(p1c);

}

Vector3d pt = pc + p1c*cos(t * theta) + temp.normalized() * R * sin(t * theta);

return pt;

}

展开全文
• 圆弧方向判断方法设p1=(x1,y1)p2=(x2,y2)p3=(x3,y3)求向量p12=(x2-x1,y2-y1)p23=(x3-x2,y3-y2)则当 p12与p23的叉乘(向量积)p12x p23 = (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2)为正时，p1-p2-p3 路径的走向为逆时针，为负时...

圆弧方向判断方法

设p1=(x1,y1)

p2=(x2,y2)

p3=(x3,y3)

求向量

p12=(x2-x1,y2-y1)

p23=(x3-x2,y3-y2)

则当 p12与p23的叉乘(向量积)

p12 x   p23  =   (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2)

为正时，p1-p2-p3   路径的走向为逆时针，

为负时，p1-p2-p3   走向为顺时针，

为零时，p1-p2-p3   所走的方向不变，亦即三点在一直线上。

可以应用在判断三点确定圆弧，圆弧是逆时针画，还是顺势针画。

求三点的夹角

利用向量的知识

A(a,b),B(c,d)是向量

cosA(A,B)=(A*B)/(|A|*|B|)= (a*c+b*d)/(sqrt(a*a+b*b)*sqrt(c*c+d*d))

A=acos(cosA)/M_PI*180

M_PI在math.h头文件中注释掉了。#define M_PI       3.14159265358979323846

注意点在计算中误差值比如cosA = 0.999999998 不是1 在A=acos(cosA)/M_PI*180得到的值是近0的1.2e-6 但是不是0。

SetArcDirection

VB声明

Declare Function SetArcDirection Lib "gdi32" Alias "SetArcDirection" (ByVal hdc As Long, ByVal ArcDirection As Long) As Long

说明

设置圆弧的描绘方向

返回值

Long，如执行成功，返回原始的圆弧方向；零意味着出错

参数表

参数类型及说明

hdcLong，要设置的设备场景

注解

可应用于下列函数：Arc， arcto， chord， Ellipse， pie， Rectangle 和 RoundRect

Windows 默认是顺时针方向？

展开全文
• Java 中的经纬度（球体）的距离换算，两坐标点之间距离换算采用的为下面代码。和一些其他方法比较起来比较精确，因为网上所有的经纬度距离换算都不一样，但都能和主流的算法在几千KM的距离上只有几百米的差距。而且...

Java 中的经纬度（球体）的距离换算，两坐标点之间距离换算采用的为下面代码。和一些其他方法比较起来比较精确，因为网上所有的经纬度距离换算都不一样，但都能和主流的算法在几千KM的距离上只有几百米的差距。而且很大一部分差距来源于对地球半径的不统一。

## 距离

第一种
采用的为立体几何的弦之间的计算都是属于高中立体几何。画图比较容易计算出来

//地球半径
public class Point {
//经度
private double longtitude;
//纬度
private double latitude；
}

//地球半径
private static double EARTH_RADIUS = 6378.137;
public static double DistanceOfTwoPoint(Point from,Point to){
double radLat1 = from.getLatitude() * Math.PI / 180.0;
double radLat2 = to.getLatitude() * Math.PI / 180.0;
double b = from.getLongtitude()* Math.PI / 180.0 - to.getLongtitude()* Math.PI / 180.0;
double s = 2 * Math.asin(sqrt(Math.pow(Math.sin(a/2),2) +
return s;
}


第二种
最暴力最简单的方法，通过立体坐标系进行计算也是最容易算出来的。那么第一步就是将经纬度转换为三维坐标。也是需要一些基础的数学功底，经纬度在各个方向轴的映射。

 //将经纬度转化为弧度
public static double torad(double deg) { return deg/180*acos(-1); }
public static double[] ChangeLonAndLaToXY(Point target){
//转为为弧度
double[] w=new double[3];
//将弧度转为在映射三维坐标的长度
double x =cos(lat)*cos(lng);
double  y = cos(lat)*sin(lng);
double z = sin(lat);
w[0]=x;
w[1]=y;
w[2]=z;
return  w;
}


通过上面的代码我们就可以将经纬度映射成一个在圆上的坐标。圆心即为地球地心，半径为1（为什么选1呐不再乘地球半径呐，因为后面我们只需要弧长即只需要向量角度，而模长均为1的向量在计算角度是只需要取向量乘积就可以得到cos，而且由于地球半径的长度，我们放在最后也能最好的保证我们计算中间更少的精度丢失。

）；
简单的数学问题两向量的三维坐标求夹角。

//计算两模为1的向量之间的cos夹角
public static double CalculateAngle(double[] first,double[] second){
double result=first[0]*second[0]+first[1]*second[1]+first[2]*second[2];return result;
}


既然cos有了弧度也就出来了（为什么求弧度那，问这样问题的人 肯定没有自己想自己画图，这个我会放在最后面给你解答，而且也有对圆形几何的全面解答）

             //计算弧度
double result1=Math.acos(result);
//根据弧度求弧长
System.out.println(result1*6378.137*1000);


我们来比较下1 2两种方法的差距

1824270.8541038772
1824270.4198887048


到了几乎没有差距的程度，很正常，因为计算中间精度的差距还是有点区别的。
解惑

球上是没有看上去直直的直线的，只有曲面直线，而且我们说圆上两点可以有无数条曲面直线的。是不是很疑惑了那么我们求的是什么东西，这样问的人肯定没有自己思考。一般我们说球上两点的距离是以同时过圆心的那个大圆的弧长来说的（三点成一面），这个弧长也是所有过两点的圆的弧长的最短距离，即两点间的最短距离。所有我们求最短距离就求过圆心的弧长就行了。

求出ab的夹角根据弧度转弧长就可得到ab在圆上的最短距离。如果不按弧度求按三角几何的话那就是ab的连线的直线距离了。你要穿地球吗?

## 点到线

以下代码为在地球球体上 两个坐标点为一条直线，另一个坐标点相对于这条线的最短距离。首先将情况分为两种
第一种
坐标点 经纬度差距很小的情况下，就可以近似的看成是平面图形 。求平面图形的点到线的距离是很简单的。已知三点经纬度 可以根据上面的方法算出三个点互相的距离 a b c，三个点互相连线为一个三角形。由三角形面积
p=（a +b+c）/2

s=底*高/2 。高为点到线的最短距离 根据以上公式可求出最短距离

public static double DistanceOfPointToLine(Point lineone,Point linetwo,Point from){
//求出三边长度
double disLine=DistanceOfTwoPoint(lineone,linetwo) ;
double disOne=DistanceOfTwoPoint(lineone,from);
double disTwo=DistanceOfTwoPoint(linetwo,from);
//判断是否在同一条线上，误差计算可能出现两条直线距离小于直线长度的情况
if((disOne+disTwo)<=disLine) return 0;
//求出三角形面积
double p=(disLine+disOne+disTwo)/2;
System.out.println(disLine);
System.out.println(disOne);
System.out.println(disTwo);
System.out.println(p);
double s=sqrt(p*(p-disLine)*(p-disOne)*(p-disTwo));
//返回Line的高即为点到线距离
return 2*s/disLine;
}


第二种
在事实上地球为一个椭圆，所有如果在经纬度差距 范围够大的情况下，这种情况是不可能看成是平面图形的。这样将会造成很大误差。那么将地球看成一个椭圆或者球体那么不可避免的就要接触到球体几何。这时候我们就要换一种算法来计算了，虽然求点到点的距离用弦之间的转换挺容易但是我们点到线之间的转换就有点麻烦了，你可以自己去试一试，挺麻烦的。所以我们采用坐标系暴力解法。

首先对问题进行解读 点到线，即为点到另外两点和圆心组成的大圆（过圆心的圆切面）的最短距离。
点到圆上两点组成的圆切面的距离，就是我们在一个空间上点到平面的最短距离，只不过我们这个最短
距离不可能是直线因为我们不可能通过地球穿过去，所有我们只能也是过大圆的圆弧长度。如果你不理解我说的话，这些话的证实结果：两个相切的大圆求弧长。 我们只要求出这个角度就行。这个角度就是线和平面的夹角。我们知道这个平面中的两条向量 就是a b经纬度转换为的向量。 高中知识 线和一平面组成的夹角我们怎么求 求出它的法向量就行了，然后我们计算法向量和这条直线的cos 直角的一∠cos等于另一∠sin的那么我们就可以得出角度 即就可以求出弧度接下来就可以求出弧长。

求法向量方法很多矩阵解三元一次方程，还有高中学的公式，自己推也可以。

那么我们要求出法向量 然后把法向量的模转为1

//计算两向量的法向量
public static double[] CalculateNormalVector(double[] first,double[] second){
double[] result=new double[3];
//根据矩阵公式算出模不为1的法向量
double x=first[1]*second[2]-first[2]*second[1];
double y=first[2]*second[0]-first[0]*second[2];
double z=first[0]*second[1]-first[1]*second[0];
//将法向量转为模为1的法向量
result[0]=x;
result[1]=y;
result[2]=z;
SloveUtils.ChangeDisModelTo1(result);
return result;
}
//将向量转为模为1的向量方便用于夹角的计算
public static void ChangeDisModelTo1(double [] target){
//模长
double disModel=Math.sqrt(target[0]*target[0]+target[1]*target[1]+target[2]*target[2]);
target[0]=target[0]/disModel;
target[1]=target[1]/disModel;
target[2]=target[2]/disModel;
}


之后求出法向量和那条直线的夹角还是我们前面封装过得夹角公式

 public static double CalculateAngle(double[] first,double[] second){
double result=first[0]*second[0]+first[1]*second[1]+first[2]*second[2];return result;
}


之后又是很简单的计算调用环节

  //点到线的比较精确距离
public static double DistanceOfPointToLineAcc(Point lineone,Point linetwo,Point from){
//将3个经纬度转为两条在三维坐标系模为1的向量
double[] vectorone=SloveUtils.ChangeLonAndLaToXY(lineone);
double[] vectortwo=SloveUtils.ChangeLonAndLaToXY(linetwo);
double[] vectorfrom=SloveUtils.ChangeLonAndLaToXY(from);
//计算出两向量的法向量
double[] normalvector=SloveUtils.CalculateNormalVector(vectorone,vectortwo) ;
//计算法向量和向量的cos值 即为from向量和其他两向量组成平面的夹角的sin值
double cos=SloveUtils.CalculateAngle(normalvector,vectorfrom);
//将cos转为弧度
double result=Math.abs(Math.asin(cos));
}


那么我们和第一种的比较看看差距有多大呐 几百km的时候差距还不是特别大，之后就会越来越大的。

1679767.499186938 1676185.9071493528


另外一种说明第一种有点不靠谱的方式：
那么还是按照平面几何来算的话大概会有多大的误差呐。我们可以采用极限的方法进行计算 a b c三点将 b c点的距离无限接近而且abc三角形为锐角三角形那么a在b c直线上的高即为a到b的距离亦或者a到c的距离。那么我们再次采用我们的两个坐标点的距离公式 a b点的距离方法。就可以得出点到直线的距离在大经纬度差距的情况下到底误差了多少。这里我将b c的纬度改变了0.00001（可忽略不计）

private static double rad(double d) {
return d * Math.PI / 180.0;
}
public static void main(String[] args){
Point a=new Point(1.6119,25.06306);
Point c=new Point(121.6119,25.06306);
Point b=new Point(121.6119,25.06305);
//两点之间距离
System.out.println(""+MapUtils.DistanceOfTwoPoint(a,b));
//由平面几何高得出的两点之间的距离
System.out.println(""+MapUtils.DistanceOfPointToLine(b,c,a));

}


结果为：1.1504384710009279E7 9275466.80930289
由此看出误差达到了 %19 而且这个误差还将随着差距的扩大而扩大这是非常不可取的 这里我们选得经纬度差距比较大 所有看起来比较夸张，但是在一两千km距离时误差也挺小的%1都不到。

最后
另外提供方位角代码

## 方位角

 private  static double getAngle1(double lat_a, double lng_a, double lat_b, double lng_b) {

double y = Math.sin(lng_b-lng_a) * Math.cos(lat_b);
double x = Math.cos(lat_a)*Math.sin(lat_b) - Math.sin(lat_a)*Math.cos(lat_b)*Math.cos(lng_b-lng_a);
double brng = Math.atan2(y, x);

brng = Math.toDegrees(brng);
if(brng < 0)
brng = brng +360;
return brng;

}

（求大神指点）

展开全文
• 在实际的应用中，线对象主要用来描述线状地物，如河流、...将鼠标移动到地图窗口中，可以看到随着鼠标的移动，在合适的位置单击鼠标左键确定直线的起始位置。再次移动鼠标确定另外一个端点的位置，单击鼠标左键完成...
• 圆弧方向判断方法和三点确定一个圆的计算方法   高精度问题也只用 BigInteger 解决即可。 【彩蛋】： 实际上有更简便的方法，直接能用更直接的公式算出圆心 (x0, y0) 和半径的平方 r^2 x0 = ((y2-y1)*(y3*y3-...
• Java最初奉献给世人的就是Applet，随即它吸引了全世界的目光，Applet运行于浏览器上，可以生成生动美丽的页面，进行友好的人机交互，同时还能处理图像、声音、动画等多媒体数据。Applet在Java的成长过程中起到不可...
• Java最初奉献给世人的就是Applet，随即它吸引了全世界的目光，Applet运行于浏览器上，可以生成生动美丽的页面，进行友好的人机交互，同时还能处理图像、声音、动画等多媒体数据。Applet在Java的成长过程中起到不可...
• 在对话框的Circle域输入圆或圆弧，单击OK按钮，即可得到该园或圆弧的圆心点。 图7-8 生成点对话框-Circle center选项,6生成给定切线方向的曲线上的切点 选择图7-3所示对话框Point type域的Tangent on curve项，...
• 磁道：磁盘在格式化时被划分成许多同心圆，这些同心圆轨迹叫做磁道，磁道从外向内从 0 开始顺序编号，信息以脉冲串的形式记录在这些轨迹中，这些同心圆不是连续记录数据，而是被划分成一段段的圆弧。 所有盘面上的...
• 绘制线对象：应用程序提供了常用的9种可直接在布局窗口中绘制的线对象，包括直线、折线、平行线、B样条曲线、Cardina曲线、贝兹曲线、自由曲线、三点弧及椭圆弧。 绘制面对象：应用程序提供了10种可直接在布局窗口...
• 作用：确定和重复上一步操作（不管上一步是什么操作） esc键 作用：取消 l（画出来的多段线不是连续的） 作用：画直线命令 选择 两种方式：框选和点选 左框选和右框选不同 左框选全框主则是选中 右框选...
• 文章目录1.小车走最远问题2. 1.小车走最远问题 一个车队有5辆同样的汽车，每辆车上装满的油能使汽车前进480千米，车子之间可以互相加油，现在5辆车同时出发，怎样安排能使其中一辆车走的最远，最远走多远？...
• * 圆弧半径 */ private float mRadius; /** * 箭头所在位置偏移量 */ private float mArrowOffset; /** * 气泡背景色 */ private int mBubbleColor; /** * 三角箭头所在位置 */ private ...
• JAVA练习题20道 1.将类的成员的访问权限设置为默认的，则该成员能被( 同一包中的类访问)。 2.下列叙述错误的是（ 2） java程序的输入输出功能是通过流来实现的 java中的流按照处理单位可分成两种：字节...
• 从上述表格中可以看出，一旦我们知道当前点p(x,y)，同时计算出ΔD，则我们就能确定从H(x+1,y)、V(x,y−1)、D(x+1,y−1)三点中选取合适的点。 3、计算增量 假设当前点为p(x,y)，下一个选取的点为pˊ(xˊ,yˊ)此时...
• L：AB两点间球面距离，也叫做大圆距离，即过AOB三点的平面与球相交所产生的圆弧中劣弧AB的长度 R：地球平均半径 Bearing：起始真航向，也叫大圆始航向。以真北为0度起点，由东向南向西顺时针旋转360度。 ...
• 然后将项目移到虚拟机上，Java调用kettle时直接连接SQLserver不成功，又别找了合适的第三方驱动jar包（而不是SQLserver官方驱动），并修改数据库类型的字符串为mssql才可以了。接下来尝试Java删除FTP上的文件，也...
• ## Android 高级面试

千次阅读 2017-02-22 08:56:26
用所有线程（注意，只能是Java线程）的函数执行情况，并将采集数据保存到/mnt/sdcard/下的一 个文件中。开发者然后需要利用SDK中的 Traceview工具来分析这些数据。 借助 Android SDK 中的 DDMS 工具。DDMS 可...
• ## Android基础知识梳理

千次阅读 多人点赞 2020-07-09 16:30:01
• ORA-09751: pw_attachPorts: 服务器调用 pws_attach 失败 ORA-09752: pw_attachPorts: port_allocate 失败 ORA-09753: spwat: 无效的进程号 ORA-09754: sppst: 传送给 sppst 的进程号无效 ORA-09755: osngpn: ...
• ORA ERROR2010-11-04 08:13 ORA-12001:无法创建日志:表''已经具有触发器。　orA-12002:表"".""上不存在任何实体化视图日志。　orA-12003:实体化视图"".""不存在。　orA-12004:REFRESHFAST不能用于实体化视图"".""。...
• ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程；...
• oracle错误代码 ORA-00001: 违反唯一约束条件 (.) 错误说明：当在唯一索引所对应的列上键入重复值时，会触发此异常。 ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ...
• 随时修正、补充 ORA-00001: 违反唯一约束条件 (.) 错误说明：当在唯一索引所对应的列上键入重复值时，会触发此异常。 ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ...
• libs/armeabi 目录下，并在工程属性->Java Build Path->Libraries 中选择“Add JARs”，选 定 baidumapapi.jar，这样就可以在应用中使用百度地图API 了。 7．bmob（服务器平台、短信验证、邮箱验证、第三方支付）...
• 要实现浏览器动态特征检测，一般有如下两种思路（第一种使用JavaScript获取到User Agent，然后根据User Agent判断浏览器的版本，再根据浏览器的版本，来确定哪些属性是在当前浏览器里支持的。缺点是并不准确；...
• ## ORACLE_错误代码

千次阅读 2020-05-18 10:03:10
本篇文章是对oracle错误代码进行了详细的总结与分析，需要的朋友参考下 ORA-00001: 违反唯一约束条件 (.) 错误说明：当在唯一索引所对应的列上键入重复值时，会触发此异常。 ORA-00017: 请求会话以设置跟踪事件 ...
• ORA-00001: 违反唯一约束条件 (.) 错误说明：当在唯一索引所对应的列上键入重复值时，会触发此异常。 ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ...

...

java 订阅