3点画圆

解三元二次方程组

X,Y,R为未知数,x1,y1,x2,y2,x3,y3为3点坐标

(x1-X)²-(y1-Y)²=R²

(x2-X)²-(y2-Y)²=R²

(x3-X)²-(y3-Y)²=R²

- (void)drawRect:(CGRect)rect {
    CGPoint point1=CGPointMake(40, 40);
    CGPoint point2=CGPointMake(40, 80);
    CGPoint point3=CGPointMake(80, 100);
    float a=2*(point2.x-point1.x);
    float b=2*(point2.y-point1.y);
    float c=point2.x*point2.x+point2.y*point2.y-point1.x*point1.x-point1.y*point1.y;
    float d=2*(point3.x-point2.x);
    float e=2*(point3.y-point2.y);
    float f=point3.x*point3.x+point3.y*point3.y-point2.x*point2.x-point2.y*point2.y;
    //圆心
    float x=(b*f-e*c)/(b*d-e*a);
    float y=(d*c-a*f)/(b*d-e*a);
    //半径
    float r=sqrt((x-point1.x)*(x-point1.x)+(y-point1.y)*(y-point1.y));

    CGContextRef context = UIGraphicsGetCurrentContext();
    [[UIColor redColor] set];
    CGContextAddArc(context, x, y, r, 0, 2*M_PI, 1);
    CGContextDrawPath(context, kCGPathStroke);
    [[UIColor greenColor] set];
    CGContextFillRect(context, CGRectMake(point1.x-0.5,point1.y-0.5,1,1));
    CGContextFillRect(context, CGRectMake(point2.x-0.5,point2.y-0.5,1,1));
    CGContextFillRect(context, CGRectMake(point3.x-0.5,point3.y-0.5,1,1));
    CGContextDrawPath(context, kCGPathStroke);
}
时间: 2024-10-10 13:54:03

3点画圆的相关文章

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

中点画圆算法

[中点画圆算法] 此算是一种圆的光栅化算法.定义以下函数: 通过上述函数,可以得到点(x,y)与半径为r的圆的关系: 已知点(Xk,Yk),我们需要知道(Xk+1,Yk).(Xk+1,Yk-1)哪一个更接近圆.决策方程如下: 如果Pk小于0,那么中点位于圆内,扫描线Yk上的像素更接近于圆.否则,中点位于圆外,应该选择Yk - 1. 参考:<计算机图形学>3.9.2 中点画圆算法 中点画圆算法

计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法

#include<iostream>#include<graphics.h>  // 这样引用 EasyX 图形库#include<conio.h>#include<time.h>#include<math.h>#include<stdlib.h>using namespace std; //Bresenham画线void Bresenham_line(int x0,int y0,int x1,int y1){ int x,y,dx,

中点画线法画圆

中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法.画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆. 类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处: (1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3; (2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5; (3) d0=1-r,即点(0,r)

图形学_圆的扫描转换

1.中点画圆算法 (1)P为当前点亮象素,那么,下一个点亮的象素可能是P1(Xp+1,Yp) 或P2(Xp +1,Yp +1). (2)构造函数:F(X,Y)=X2  +  Y2 -  R2 :则 F(X,Y)=  0  (X,Y)在圆上: F(X,Y)< 0   (X,Y)在圆内: F(X,Y)> 0   (X,Y)在圆外. 设M为P1.P2间的中点,M=(Xp+1,Yp-0.5) 有如下结论: F(M)< 0  ->M在圆内->  取P1 F(M)>= 0 ->

OpenGL画圆

中点画圆 1 #include<gl/glut.h> 2 3 4 void MidPointCirle(int r) 5 { 6 int x,y; 7 float d; 8 x=0;y=r;d=1.25-r; 9 glColor3f(1.0f,1.0f,1.0f); 10 glVertex2i(x,y); 11 while(x<=y) 12 { 13 if(d<0) 14 d+=2*x+3; 15 else 16 { 17 d+=2*(x-y)+5; 18 y--; 19 } 20

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y

android中实现毛笔效果(View 中绘图)

最近有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果.传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序.然而要达到毛笔的笔锋效果则需要更为详细点的设计.我的实现思路是通过以触摸事件DOWN.MOVE.UP中的每一个点为圆心画圆,除此之外还可通过触摸压力的大小改变所绘圆的半径,这样一连串的圆便可粗略地模拟毛笔笔锋效果,在设计次效果时遇到两个问题: 1:android触摸中的MOVE时间取点的频率不是很高,会隔一定的像素取点,当轻触滑动时会出现一天不连续圆

OpenGL学习进程(13)第十课:基本图形的底层实现及算法原理

    本节介绍OpenGL中绘制直线.圆.椭圆,多边形的算法原理.     (1)绘制任意方向(任意斜率)的直线: 1)中点画线法: 中点画线法的算法原理不做介绍,但这里用到最基本的画0<=k<=1的中点画线法实现任意斜率k直线的绘制. 1)当A点x坐标值大于B点坐标值时,即A点在B点的右侧时,交换A.B点的坐标.保证A点在B的左侧. 2)考虑特殊情况,当直线AB的斜率不存在时,做近似处理,设置斜率为-(y0-y1)*100,即近似无穷大. 3)当斜率m满足0<=m<=1时,按书