精华内容
下载资源
问答
  • 如何判断点是否在圆弧上

    千次阅读 2021-04-30 11:51:07
    如何判断点是否在圆弧上 已知一个圆弧三点,A(起点),B(中点),C(结束)。 可以求出圆心、半径 红色的分别是圆上的起点、中点、结束。 1、首先判断圆心到某P的距离,是否等于半径。 如果不等于半径,则不圆...

    如何判断点是否在圆弧上

    已知一个圆弧三点,A(起点),B(中点),C(结束点)。

    可以求出圆心、半径
    在这里插入图片描述

    红色的分别是圆上的起点、中点、结束点。

    1、首先判断圆心到某点P的距离,是否等于半径。

    如果不等于半径,则不在圆上
    

    2、连接AB和BC,连接中心点O到点P

    如果线段AB或BC其一与OP相交,则点P在圆弧上
    反之,点P不在圆弧上
    

    代码实现比较简单,就不贴了

    展开全文
  • import java.util.ArrayList;.../*** java判断某个是否所画范围内(多边形【isPtInPoly】/圆形【distencePC】)* @param point 检测* @param pts 多边形的顶点* @return 点在多边形内返回true,否则返回fals...

    package com.ardo.util.circle;

    import java.util.ArrayList;

    import java.util.List;

    /**

    * java判断某个点是否在所画范围内(多边形【isPtInPoly】/圆形【distencePC】)

    * @param point 检测点

    * @param pts 多边形的顶点

    * @return 点在多边形内返回true,否则返回false

    *

    */

    public class IsPtInPoly {

    /**

    \* 判断点是否在多边形内

    \* @param point 检测点

    \* @param pts 多边形的顶点

    \* @return 点在多边形内返回true,否则返回false

    */

    public static boolean isPtInPoly(Point2D point, List pts){

    int N = pts.size();

    boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true

    int intersectCount = 0;//cross points count of x

    double precision = 2e-10; //浮点类型计算时候与0比较时候的容差

    Point2D p1, p2;//neighbour bound vertices

    Point2D p = point; //当前点

    p1 = pts.get(0);//left vertex

    for(int i = 1; i <= N; ++i){//check all rays

    if(p.equals(p1)){

    return boundOrVertex;//p is an vertex

    }

    p2 = pts.get(i % N);//right vertex

    if(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)){//ray is outside of our interests

    p1 = p2;

    continue;//next ray left point

    }

    if(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)

    if(p.y <= Math.max(p1.y, p2.y)){//x is before of ray

    if(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray

    return boundOrVertex;

    }

    if(p1.y == p2.y){//ray is vertical

    if(p1.y == p.y){//overlies on a vertical ray

    return boundOrVertex;

    }else{//before ray

    ++intersectCount;

    }

    }else{//cross point on the left side

    double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y

    if(Math.abs(p.y - xinters) < precision){//overlies on a ray

    return boundOrVertex;

    }

    if(p.y < xinters){//before ray

    ++intersectCount;

    }

    }

    }

    }else{//special case when ray is crossing through the vertex

    if(p.x == p2.x && p.y <= p2.y){//p crossing over p2

    Point2D p3 = pts.get((i+1) % N); //next vertex

    if(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x

    ++intersectCount;

    }else{

    intersectCount += 2;

    }

    }

    }

    p1 = p2;//next ray left point

    }

    if(intersectCount % 2 == 0){//偶数在多边形外

    return false;

    } else { //奇数在多边形内

    return true;

    }

    }

    /**

    \* 判断是否在圆形内

    \* @param p

    \* @param c

    \* @return

    */

    public static String distencePC(Point2D p,Circle c){//判断点与圆心之间的距离和圆半径的关系

    String s ;

    double d2 = Math.hypot( (p.getX() - c.getCC().getX() ), (p.getY() - c.getCC().getY()) );

    System.out.println("d2=="+d2);

    double r = c.getR();

    if(d2 > r){

    s = "圆外";

    }else if(d2 < r){

    s = "圆内";

    }else{

    s = "圆上";

    }

    return s;

    }

    public static void main(String\[\] args) {

    Point2D point = new Point2D(116.404072, 39.916605);

    // 测试一个点是否在多边形内

    List pts = new ArrayList();

    pts.add(new Point2D(116.395, 39.910));

    pts.add(new Point2D(116.394, 39.914));

    pts.add(new Point2D(116.403, 39.920));

    pts.add(new Point2D(116.402, 39.914));

    pts.add(new Point2D(116.410, 39.913));

    if(isPtInPoly(point, pts)){

    System.out.println("点在多边形内");

    }else{

    System.out.println("点在多边形外");

    }

    // 测试一个点是否在圆形内

    Point2D centerPoint = new Point2D(116.404172, 39.916605);

    Circle c = new Circle();

    c.setCC(centerPoint);

    c.setR(0.0056);

    String s = distencePC(point,c);

    System.out.println("点是否在圆内:"+s);

    }

    }

    /**

    * 圆形类

    *

    *

    */

    public class Circle {

    private double r;

    private Point2D cc;

    public void setR(double a){

    r = a;

    }

    public void setCC(Point2D centerOfCir){

    cc = centerOfCir;

    }

    public double getR(){

    return r;

    }

    public Point2D getCC(){

    return cc;

    }

    }

    public class Point2D {

    public double x;

    public double y;

    public Point2D(double x, double y) {

    super();

    this.x = x;

    this.y = y;

    }

    public double getX() {

    return x;

    }

    public void setX(double x) {

    this.x = x;

    }

    public double getY() {

    return y;

    }

    public void setY(double y) {

    this.y = y;

    }

    }

    展开全文
  • 如题,我用Graphics的DrawRac画了一段圆弧,现在想知道该圆弧上某一点的坐标。我的思路是判断鼠标是否当前弧线上,如果的话就获取当前鼠标的坐标值,可是如何才能判断鼠标是否弧线上呢。 我看CSDN上判断点...
  • 主要为大家详细介绍了Android如何判断当前点击位置是否圆的内部,解析拖动圆形控件之内响应触摸事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • //从圆弧一些信息得到圆弧上一个特殊的(计算的是二维图形的情况)Point3dDBOPERATION::GetArcTangencyPoint(Point3dpStartPoint,Point3dpEndPoint,Point3dpCenterPoint,doubledRadius,doubledStartAngle,...

    //从圆弧一些信息得到圆弧上一个特殊的点(计算的是二维图形的情况)Point3d DBOPERATION::GetArcTangencyPoint(Point3d pStartPoint, Point3d pEndPoint,

    Point3d pCenterPoint,doubledRadius,doubledStartAngle,doubledSweepAngle)

    {

    Point3d pResultPoint;

    pResultPoint.X=0;

    pResultPoint.Y=0;

    pResultPoint.Z=0;//因为会得到两个点,哪个点在弧上需要再进行判断doubledRx1=0;doubledRx2=0;doubledRy1=0;doubledRy2=0;constdoublePI=3.1415926535897932;

    Point3d pMiddlePoint;

    pMiddlePoint.X=(pStartPoint.X+pEndPoint.X)/2;

    pMiddlePoint.Y=(pStartPoint.Y+pEndPoint.Y)/2;

    pMiddlePoint.Z=0.0;//扫角的角度值doubledArcSweepAngle=180*dSweepAngle/PI;//中点到圆心的距离doubleddy=0;doubleddx=0;if(pMiddlePoint.X-pCenterPoint.X>=0.1e-6)

    {

    ddx=pMiddlePoint.X-pCenterPoint.X;

    }if(pMiddlePoint.Y-pCenterPoint.Y>=0.1e-6)

    {

    ddx=pMiddlePoint.Y-pCenterPoint.Y;

    }doubledDistance=sqrt(ddx*ddx+ddy*ddy);if((fabs(pMiddlePoint.Y-pCenterPoint.Y)<0.1e-6&&fabs(pMiddlePoint.X-pCenterPoint.X)<0.1e-6)&&(fabs(pStartPoint.X-pEndPoint.X)<0.1e-6||fabs(pStartPoint.Y-pEndPoint.Y)<0.1e-6))

    {//半圆且斜率=0或者斜率为无穷大的情况if(fabs(pStartPoint.X-pEndPoint.X)<0.1e-6)

    {//结果的两个X的值dRx1=pMiddlePoint.X+(dRadius-dDistance);

    dRx2=pMiddlePoint.X-(dRadius+dDistance);//对应的两个Y的值dRy1=pMiddlePoint.Y;

    dRy2=pMiddlePoint.Y;

    }if(fabs(pStartPoint.Y-pEndPoint.Y)<0.1e-6)

    {//结果的两个X的值dRx1=pMiddlePoint.X;

    dRx2=pMiddlePoint.X;//对应的两个Y的值dRy1=pMiddlePoint.Y+(dRadius-dDistance);

    dRy2=pMiddlePoint.Y-(dRadius+dDistance);

    }

    }elseif(fabs(pMiddlePoint.Y-pCenterPoint.Y)<0.1e-6&&fabs(pMiddlePoint.X-pCenterPoint.X)>=0.1e-6)

    {//圆心与端点中心点在水平线上的情况,斜率=0//结果的两个X的值dRx1=pMiddlePoint.X+(dRadius-dDistance);

    dRx2=pMiddlePoint.X-(dRadius+dDistance);//对应的两个Y的值dRy1=pMiddlePoint.Y;

    dRy2=pMiddlePoint.Y;

    }elseif(fabs(pMiddlePoint.X-pCenterPoint.X)<0.1e-6&&fabs(pMiddlePoint.Y-pCenterPoint.Y)>=0.1e-6)

    {//圆心与端点中心点在垂直线上的情况,斜率=无穷大//结果的两个X的值dRx1=pMiddlePoint.X;

    dRx2=pMiddlePoint.X;//对应的两个Y的值dRy1=pMiddlePoint.Y+(dRadius-dDistance);

    dRy2=pMiddlePoint.Y-(dRadius+dDistance);

    }else{//圆弧两个端点成线的斜率,已经排除了等于0或者无穷大的可能性doubledTheKSAE=(pEndPoint.Y-pStartPoint.Y)/(pEndPoint.X-pStartPoint.X);//与端点组成的线垂直的线的斜率(0度,180度,360度弧的dk需要特殊处理)doubledK=(1/dTheKSAE)*(-1);if(fabs(fabs(dArcSweepAngle)-360)<0.1e-6)

    {

    dK=(pMiddlePoint.Y-pCenterPoint.Y)/(pMiddlePoint.X-pCenterPoint.X);

    }if(fabs(fabs(dArcSweepAngle)-180)<0.1e-6)

    {

    dK=(pStartPoint.Y-pCenterPoint.Y)/(pStartPoint.X-pCenterPoint.X);

    dK=(1/dK)*(-1);

    }if(fabs(fabs(dArcSweepAngle)-0)<0.1e-6)

    {

    dK=(pMiddlePoint.Y-pCenterPoint.Y)/(pMiddlePoint.X-pCenterPoint.X);

    }///这是经过两端点中点并与两端点组成的直线垂直的直线的方程//k为斜率,M(x),M(y)分别为中心点坐标值//y=k * x - k * M(x) + M(y)///求出- k * M(x) + M(y)部分的值doubledDif=(-1)*dK*pMiddlePoint.X+pMiddlePoint.Y;///[x - C(x)]^2 + [y - C(y)]^2 = r^2//代入上面的y,其中- k * M(x) + M(y)以dDif代替//[x - C(x)]^2 + [kx + dDif - C(y)]^2 = r^2//下面以dBetween代替+ dDif - C(y)/doubledBetween=dDif-pCenterPoint.Y;///x^2 + 2*C(x)*x + [C(x)]^2//+//(kx)^2 + 2*k*dBetween*x + (dBetween)^2//= r^2///再求中间值doubledNx=(2*dK*dBetween-2*pCenterPoint.X)/(1+dK*dK);doubledLa=(dRadius*dRadius-pCenterPoint.X*pCenterPoint.X-dBetween*dBetween)/(1+dK*dK);doubledAd=dLa+dNx*dNx/4;//结果的两个X的值dRx1=sqrt(dAd)-dNx/2;

    dRx2=(-1)*sqrt(dAd)-dNx/2;//对应的两个Y的值dRy1=dK*dRx1-dK*pMiddlePoint.X+pMiddlePoint.Y;

    dRy2=dK*dRx2-dK*pMiddlePoint.X+pMiddlePoint.Y;

    }//对得到的两个点进行判断,找到在弧上的那个pResultPoint.X=dRx1;

    pResultPoint.Y=dRy1;if(fabs(fabs(dArcSweepAngle)-180.0)<0.1e-4)

    {//半圆情况处理doublep1x,p1y,p2x,p2y,qx,qy,dx1,dy1,dx2,dy2,det;

    p2x=pStartPoint.X;

    p2y=pStartPoint.Y;

    p1x=pCenterPoint.X;

    p1y=pCenterPoint.Y;

    qx=dRx2;

    qy=dRy2;

    dx1=p2x-p1x;

    dy1=p2y-p1y;

    dx2=qx-p2x;

    dy2=qy-p2y;

    det=dx1*dy2-dx2*dy1;

    BOOL bBlockWise=TRUE;if(det>0.0)

    {//逆时针方向bBlockWise=FALSE;

    }if(((!bBlockWise)&&(dArcSweepAngle>0.0))||((bBlockWise)&&(dArcSweepAngle<0.0)))

    {

    pResultPoint.X=dRx2;

    pResultPoint.Y=dRy2;

    }

    }else{//非半圆的情况doubledd1=sqrt(pow(dRx1-pMiddlePoint.X,2)+pow(dRy1-pMiddlePoint.Y,2));doubledd2=sqrt(pow(dRx2-pMiddlePoint.X,2)+pow(dRy2-pMiddlePoint.Y,2));if(((dd1180.0))||((dd1>dd2)&&(fabs(dArcSweepAngle)<180.0)))

    {

    pResultPoint.X=dRx2;

    pResultPoint.Y=dRy2;

    }

    }returnpResultPoint;

    }

    展开全文
  • 圆弧上非共线的三点 设 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=(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 所走的方向不变,亦即三点在一直线上。

    展开全文
  • 圆弧方向判断方法设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 路径的走向为逆时针,为负时...
  • 判断圆弧的角度

    千次阅读 2019-07-11 19:13:30
    已知圆弧的起点、终点,圆的终点,顺时针转。 那么只要求起点和终点角度及角度差(最小的),将起点角度加上该角度差是否等于终点角度,如果是,那么圆弧角度为此角度差,如果不是,则2PI-该角度差。 ...
  • 关于求线段和线段,线段和圆弧圆弧圆弧的交点算法和测试程序,里面有算法代码,和测试程序,主要时理解算法,算法分析:http://blog.csdn.net/u012727080/article/details/78908614
  • 判断线段与圆弧的交点

    千次阅读 2017-08-11 11:14:42
    最近项目中用到需要判断线段与圆弧的相交性问题,上网查找了下竟然发现没有相关的文章或代码,苦苦探索了下,想了个可行的方法,项目中使用到直线段由两个表示,圆弧是由3个按照逆时针的顺序给出。 基本思路...
  • 判断点击是否圆环(圆)内

    千次阅读 2019-09-24 10:56:59
    这是移动端判断事件touch,pc端一样的。 首先先画出来一个圆环; 下面是html代码 <div class="circleHandle"> <div class="cirAround"> <div class="cirAro"></div> <div ...
  • #include //运行时坐标结构体typedef struct{float xCdt;...//直线的逐比较法的直线插补的坐标的结构体typedef struct{float xCdt_Sat; //起点坐标float yCdt_Sat;float xCdt_Tgt; //终点坐标float yCd...
  • c++实现判断点与圆的位置关系

    千次阅读 2020-12-21 14:55:22
    (1)点在 (2)点在圆内 (3)点在圆外 c++代码实现: #include <iostream> using namespace std; //判断点和圆的位置关系 //类 class Point { public: //getset方法 void setX(int x){...
  • a、我这里的算法是判断2条线段的定义域和值域是否有重合地方,有则进行下一步判断,没有这返回空,表示没有交点。 b、根据直线方程2式y - y1 = (y2 - y1) / (x2 - x1)(x - x1),进行解方程,不过这之前先进行对...
  • 废话不多说,直接进入正题:判断是否特定区域内,使用 java.awt.geom.GeneralPath 类中的 contains 方法;该类常用的构造方法:GeneralPath ( ) 构造一个新的单精度空 GeneralPath 对象GeneralPath(Shape s) ...
  • 第二步判断点圆弧的位置关系 通过分析,可分为两种情况; 情况一,ans1为p到p1的距离减去圆的半径的绝对值 情况二,ans2为p到A,C两的距离最小值 给出f1,f2,f3,f4分别表示向量 p1A, p1B,p1C,p1P与x正半轴的...
  • 最近同事想让要做一个绘图的控件。...首先来简单介绍下圆弧插补:有两种圆弧插补:G02 顺时针圆弧插补G03 逆时针圆弧插补圆弧插补编程(半径编程):圆弧用编程功能G02 或G03 和其后圆弧终点坐标和半径值定义。 圆弧...
  • csu 圆弧的最短距离

    千次阅读 2017-06-13 22:29:35
    换句话说,你需要在圆弧上找一个,到P的距离最小。 提示:请尽量使用精确算法。相比之下,近似算法更难通过本题的数据。 Input 输入包含最多10000组数据。每组数据包含8个整数x1, y1, x2, y2, x3, y3, xp, ...
  • 比较法就是输出直线或圆弧的过程中,每走完一步就与理论的直线或圆弧进行比较,确定当前是在线或弧,还是在线或弧的一侧,然后再决定下一步的走向,这样一步一步地逼近所画直线或圆弧。 逐比较法是...
  • 圆弧的距离

    千次阅读 2016-05-04 10:07:22
    换句话说,你需要在圆弧上找一个,到P的距离最小。 提示:请尽量使用精确算法。相比之下,近似算法更难通过本题的数据。 Input 输入包含最多10000组数据。每组数据包含8个整数x1, y1, x2, y2, x3...
  • 判断点是否多边形的内部(C#)

    千次阅读 2015-10-13 09:17:02
    判断点是否多边形的内部,适用于任意多边形的方法最常用的就是射线法,即以要判断向左或者向右作水平射线,与多边形交点的个数为奇数个时则多边形的内部,若为偶数个交点时则多边形的外部,其中0个交点...
  • 使用MFC封装了一个绘制圆弧的类,只需要把坐标通过接口传递进去就行,绘制圆弧难点在于如何判断圆弧绘制的方向,这里只是一个小小测试例子希望可以帮助到你。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,614
精华内容 2,645
关键字:

判断点在圆弧上