• //判断p在圆上、圆内或圆外，返回值：圆内，==0圆上，>0 圆外 protected: double radius; }; //重载运算符“”，使之按规定的形式输出圆的信息 ostream &operator(ostream &output,const Circle &c) { ...
#include <iostream>
#include<Cmath>
using namespace std;
class Point
{
public:
Point(double a=0,double b=0):x(a),y(b) {} //构造函数
double distance(const Point &p) const;	//求距离
friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<”
protected:	  //受保护成员
double x,y;
};

double Point::distance(const Point &p) const	//求距离
{
double dx = x-p.x;
double dy = y-p.y;
return sqrt(dx*dx+dy*dy);
}

ostream & operator<<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}

class Circle:public Point //circle是Point类的公用派生类
{
public:
Circle(double a=0,double b=0,double r=0) :Point(a,b),radius(r) { }; //构造函数
friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”
friend int locate(const Point &p, const Circle &c); //判断点p在圆上、圆内或圆外，返回值：<0圆内，==0圆上，>0 圆外
protected:
};

//重载运算符“<<”，使之按规定的形式输出圆的信息
ostream &operator<<(ostream &output,const Circle &c)
{
return output;
}

//判断点p在圆内、圆c内或圆c外
int locate(const Point &p, const Circle &c)
{
const Point cp(c.x,c.y); //圆心
double d = cp.distance(p);
if (abs(d - c.radius) < 1e-7)
return 0;  //相等
return -1;  //圆内
else
return 1;  //圆外
}

int main( )
{
Circle c1(3,2,4);
Point p1(1,1),p2(3,-2),p3(7,3);  //分别位于c1内、上、外

cout<<"圆c1: "<<c1;

cout<<"点p1: "<<p1;
cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"内":"上"))<<endl;

cout<<"点p2: "<<p2;
cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl;

cout<<"点p3: "<<p3;
cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"内":"上"))<<endl;
return 0;
}


运行结果


展开全文
• 三角形外接圆心叫外心。 /// /// Returns true if the point (p) lies inside the circumcircle made up by points (p1,p2,p3) /// /// /// NOTE: A point on the edge is inside the circumcircle...
三角形的外接圆圆心是任意两边的垂直平分线的交点。 三角形外接圆圆心叫外心。                  /// <summary>
/// Returns true if the point (p) lies inside the circumcircle made up by points (p1,p2,p3)
/// </summary>
/// <remarks>
/// NOTE: A point on the edge is inside the circumcircle
/// </remarks>
/// <param name="p">Point to check</param>
/// <param name="p1">First point on circle</param>
/// <param name="p2">Second point on circle</param>
/// <param name="p3">Third point on circle</param>
/// <returns>true if p is inside circle</returns>
private static bool InCircle(Geometry.Point p, Geometry.Point p1, Geometry.Point p2, Geometry.Point p3)
{
//Return TRUE if the point (xp,yp) lies inside the circumcircle
//made up by points (x1,y1) (x2,y2) (x3,y3)
//NOTE: A point on the edge is inside the circumcircle

if (System.Math.Abs(p1.Y - p2.Y) < double.Epsilon && System.Math.Abs(p2.Y - p3.Y) < double.Epsilon)
{
//INCIRCUM - F - Points are coincident !!
return false;
}

double m1, m2;
double mx1, mx2;
double my1, my2;
double xc, yc;

if (System.Math.Abs(p2.Y - p1.Y) < double.Epsilon)
{
m2 = -(p3.X - p2.X) / (p3.Y - p2.Y);
mx2 = (p2.X + p3.X) * 0.5;
my2 = (p2.Y + p3.Y) * 0.5;
//Calculate CircumCircle center (xc,yc)
xc = (p2.X + p1.X) * 0.5;
yc = m2 * (xc - mx2) + my2;
}
else if (System.Math.Abs(p3.Y - p2.Y) < double.Epsilon)
{
m1 = -(p2.X - p1.X) / (p2.Y - p1.Y);
mx1 = (p1.X + p2.X) * 0.5;
my1 = (p1.Y + p2.Y) * 0.5;
//Calculate CircumCircle center (xc,yc)
xc = (p3.X + p2.X) * 0.5;
yc = m1 * (xc - mx1) + my1;
}
else
{
m1 = -(p2.X - p1.X) / (p2.Y - p1.Y);
m2 = -(p3.X - p2.X) / (p3.Y - p2.Y);
mx1 = (p1.X + p2.X) * 0.5;
mx2 = (p2.X + p3.X) * 0.5;
my1 = (p1.Y + p2.Y) * 0.5;
my2 = (p2.Y + p3.Y) * 0.5;
//Calculate CircumCircle center (xc,yc)
xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
yc = m1 * (xc - mx1) + my1;
}

double dx = p2.X - xc;
double dy = p2.Y - yc;
double rsqr = dx * dx + dy * dy;
//double r = Math.Sqrt(rsqr); //Circumcircle radius
dx = p.X - xc;
dy = p.Y - yc;
double drsqr = dx * dx + dy * dy;

return (drsqr <= rsqr);
}
展开全文
主要有两种方法

先求出三角形的外接圆的圆心的坐标，然后判断该点到圆心的距离


展开全文
• 在圆环内随机生成点

千次阅读 2020-01-20 23:49:20
策划给了个需求，给定一个圆环，内径r1，外径r2，要圆环内随机产生这些位置生成法术场。那么如何圆环内随机产生这些呢？ 在圆内随机生成 首先考虑在圆内生成随机。 最简单的方法是一个R*R的...
这里写自定义目录标题在圆内随机生成点生成CDF（累计分布函数）交换x，y使用均匀分布函数带入python代码在圆环内随机生成点类似求圆的概率密度函数，分布函数生成CDF（累计分布函数）交换x，y使用均匀分布函数带入python代码
策划给了个需求，给定一个圆环，内径r1，外径r2，要在圆环内随机产生点，在这些点位置上生成法术场。那么如何在圆环内随机产生这些点呢？
在圆内随机生成点
首先考虑在圆内生成随机点。
最简单的方法是在一个R*R的正方形内随机选取一个点，判断随机生成的点是否在圆内即可。python代码如下：
import random
def generateRandomPoint(r):
while True:
x = random.uniform(-r, r)
y = random.uniform(-r, r)
if x * x + y * y <= r * r:
return x,y

还有一个简单的方法是:
先随机x的值, 根据$x^2+y^2<=r^2$，随机y的范围。
python代码如下:
import math
import random
def generateRandomPoint3(r):
x = random.uniform(-r, r)
square = math.sqrt(r*r-x*x)
y = random.uniform(-square, square)
return x,y

还有一个方法是根据半径和角度确定坐标
$r\in[o,R] \\ \theta\in[0,2\pi] \\ x = r * \cos(\theta) \\ y = r * \sin(\theta)$
python代码
import math
def generateRandomPoint1(r):
random_r = random.uniform(0, r)
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)

但是很明显，上面生成的点的数据不是均匀分布的。
原因：
我们期望随机生成的点在圆上是均匀分布的。假设在半径为1的圆内生成点。假设一开始半径是0.5，生成角度在$[0,2\pi]$的点的密度明显要大于半径1.0，生成角度在$[0,2\pi]$的点。

即圆的半径$2\pi r$增长和半径$r$正相关，即半径越大，需要的点也是线性增长的。即pdf也是线性增长的。由于pdf的面积大小是1，我们的半径长度是1，即

PDF表示概率密度函数（给出了变量落在某值xi邻域内（或者某个区间内）的概率变化快慢，概率密度函数的值不是概率，而是概率的变化率，概率密度函数下面的面积才是概率。见2）
那么如何根据一个均匀分布的随机生成函数random.uniform来产生我们需要的定点呢？
生成CDF（累计分布函数）
$CDF(x)=\int PDF=\int 2x = x^2$
交换x，y
$CDF:y=x^2\\ swap:x=y^2\\ solve:y=\sqrt x \\ CDF^{-1}=y=\sqrt x$
使用均匀分布函数带入
$CDF^{-1}(random())=\sqrt {random()}$
python代码
import math
def generateRandomPoint2(r):
random_r = math.sqrt(random.uniform(0, r))
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)

在圆环内随机生成点
最简单的方法是在一个R*R的正方形内随机选取一个点，判断随机生成的点是否在圆环内即可。python代码如下：
def generateRandomPointFromAnnulus(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
while True:
x = random.uniform(-r2, r2)
y = random.uniform(-r2, r2)
if x * x + y * y <= r2 * r2 and x * x + y * y >= r1 * r1:
return x,y

第二种方法是随机先随机得到x的值，然后算出y的范围，随机y的值，python代码如下:
import math
def generateRandomPointFromAnnulus1(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
x = random.uniform(r1, r2)
y = random.uniform(math.sqrt(x*x-r1*r1), math.sqrt(r2*r2-x*x))
return x if random.uniform(-1,1) > 0 else -x, y if random.uniform(-1,1) > 0 else -y

类似求圆的概率密度函数，分布函数
生成CDF（累计分布函数）
和圆不一样，概率密度函数是从$[r_{min},r_{max}]$,而不是$[0,r_{max}]$
$CDF(x)=\int_{r_{min}}^{r_{max}} r dr= \frac{\pi r^2-\pi r_{min}^2}{\pi r_{max}^2-\pi r_{min}^2} = A(r^2 - r_{min}^2)\\ A = 1/(r_{max}*r_{max} - r_{min}*r_{min})$
交换x，y
$CDF:y=A(x^2 - r_{min}^2)\\ swap:x=A(y^2 - r_{min}^2)\\ solve:y=\sqrt {\frac {x}{A} + r_{min}^2} \\ CDF^{-1}=y=\sqrt {\frac {x}{A} + r_{min}^2}$
使用均匀分布函数带入
$CDF^{-1}(random())=\sqrt {\frac {random()}{A} + r_{min}^2}$
python代码
import math
def generateRandomPointFromAnnulus2(r1,r2):
"""
在圆环内随机取点, r1<=r2
:param r1: 内径
:param r2: 外径
:return:
"""
assert r1<= r2
a = 1 / (r2*r2-r1*r1)
random_r = math.sqrt(random.uniform(0, 1) / a  + r1 * r1)
random_theta = random.uniform(0, 2 * math.pi)
return random_r * math.cos(random_theta), random_r * math.sin(random_theta)



展开全文
• 通过点拟合圆

2020-07-23 21:25:33
通过拟合三点确定一个 三点确定一个
• js获取圆上的点

千次阅读 2019-02-27 15:26:32
最近写动画效果，需要获取圆上就简单的回顾了一下数学知识   这里圆点0 为圆心，我们需要知道A的（x,y）坐标，因为这个就是圆点上，而r就是半径，通过三角函数可得出： cos(A) = c/b; sin(A) = c/a...
• 点在多边形内常用的算法就是使用射线法，作为笔记直接代码： /** * 判断一个是否多边形内部 * @param points 多边形坐标集合 * @param testPoint 测试坐标 * 返回true为真，false为假 * */ ...
• 判断一个点在圆内还是圆外

千次阅读 2018-07-23 23:54:21
首先可以先确定一个的申明方式，后续可以通过确定圆心。 #ifndef _POINT_H #define _POINT_H class Point {  private:  int m_x;  int m_y;  public:  void setxy(int x,int y);  int getdistance(Poi....
• 2.右键find similar objects，然后弹出的对话框中，将要修改的属性后的any改为same3.点击应用后，原理图中相同属性的器件均高亮显出，此时点击确认。4.点击cltl+a，全选（关键一步）5.属性对话框中修改要修改的...
• 判断一个点在曲线的理论依据是什么呢？前面已经说了，素域Fp的椭圆曲线E由（仿射）方程y2＝x3＋ax＋b决定，所以Jacobi射影P＝(X,Y,Z)曲线就看这个是不是满足射影方程y2＝x3＋axz4＋bz6。带入P分别...
• Java：定义一个未知，判断未知是否在圆内。如果在圆内，输出true，否则输出false。题目要求设计思路代码类方法运行结果 题目要求 设计思路 设计思路根据题目要求： 1.设计一个类代表二维空间的一个...
• 三个点确定一个圆

千次阅读 2017-10-01 08:17:06
则这个可以表示为： (x−x0)2+(y−y0)2=r2​(x - x0)^2+(y - y0)^2 = r^2​ 假设知道的三个为(x1, y1)，(x2,y2)，(x3,y3)。那么： (x1−x0)2+(y1−y0)2=r2(x1 - x0)^2+(y1 - y0)^2 = r^2 (x2−x0)2+(y2−y0)2=r2...
• 1.根据圆上的两个和半径获得两个圆的算法 #define MAXCOM_F(a, b) ((a)-(b)&gt;0.00001) ? true : false QVector&lt;QRectF&gt; EICWidget::getEllipseCoors(const QPointF &amp;r1, const ...
• // i： 圆上点的个数，默认15个，建议73个 countCircle(t, e, i) { for( var r = t / 6378137, n = [e[0], e[1]], o = [this.numberToRadius(n[1]), this.numberToRadius(n[0])], s = ((i = i || 15), []), a ...
• 圆弧方向判断方法和三点确定一个的计算方法
• 2. 根据中心的距离，确定点是否在圆内； 3. 使用opencv进行显示说明；（当然，如果使用opencv的mask，很容易就能判断出点是否四边形或者内部） #include <iostream> #include <opencv2\...
• 的每个，可以理解为X和Y轴，，，x和y香蕉的地方就是这个的位置，使用三角函数可以得到这个位置 首先 确定圆的半径 R X=R*Math.cos(100) Y=R*Math.sin(100) 100 animation的运动 贝塞尔...
• * @fileoverview GeoUtils类提供若干几何算法，用来帮助用户判断与矩形、 * 圆形、多边形线、多边形面的关系,并提供计算折线长度和多边形的面积的公式。 * 主入口类是GeoUtils， * 基于Baidu Map API 1.2。 ...
• 在圆内均匀分布点

千次阅读 2019-04-02 12:06:56
转载自:... import numpy as np import matplotlib.pyplot as plt import random import math def random_point(car_num,radius): for i in range(1, car_num ...
• 任意一点A确定，B也确定之后，要形成锐角三角形，C必须DE之间，否则将成为直角或钝角三角形ABC。设AB对应夹角为θ，θ（0，π）才有可能形成锐角三角形。θ的概率密度是1/π，此时组成锐角三角形需要C点在AB...
• 小明使用mapbox-gl进行开发时，需要实现用户指定地图的一个，然后根据这个，突出显示以其为中心的一定半径的圆形区域。半径可以为小明指定的千米数。 具体实现点击产生的功能就不描述了，这里主要描述产生...
• 取单位圆上任意不同两A和B，A、B两点确定以后，A、B、C三点要够成锐角三角形，C必须DE之间，否将构成直角三角形（C与D或E重合）或钝角三角形。设AB弧所对应的圆心角为$$\theta$$,则当且仅当\(\theta...
• 本题ZOJ题号是1090，POJ是2242。题目描述如下： Description To calculate the circumference of a circle seems to be an easy task - provided you know its diameter. But what if you d
• 我们自动化贴装机标定过程中，需要计算吸头的旋转中心位置。我们一般使用的方法是使用模板匹配，做一个模板，吸头旋转一个角度寻找模板一次，通过多次旋转求取吸头的旋转中心。 使用halcon实现 public bool ...
• 加强记忆。。。 圆点坐标：(x0,y0) 半径：r 角度：angel 则上任一点为：（x1,y1） x1 = x0 + r * cos(angel * PI /180 ) y1 = y0 + r * sin(angel * PI /180 )
• 判断的位置关系 第一步，创建一个类，代表二维空间的一个。二维空间确定一个可参考平面直角坐标系中，确定了x坐标和y坐标，即可确定点的位置 package com.tyl.homework; import java.util.Scanner; /** ...
• 点的覆盖圆

千次阅读 2011-05-09 20:39:00
1.问题提出 已知平面8个... ②若最小贺的圆周有3个（或3个以上），则最小为这3个（或3个以上）的外接。 求外接的步骤如下： ⑴求出两(x1,y1)、(x2,y2)的距离L1： L1=s
• 定义：圆上之间的距离为两的之间的劣弧，用弧度表示即为两个弧度的的差值不能大于180；如：10,180，距离为173；10,198，距离为172。 题目要求： 输入：输入圆上点的个数n，依次从小到大输入圆上的n个的弧度...

...