计算机图形学——八分法中点画圆

八分法中点画圆

实现方法:从0°到45°开始画,其余部分进行求对称

1 、绘制X^2+Y^2=R^2的圆,将圆划分为⑧等份。我们从第二份开始绘制

分析:

最大位移方向是Y方向,因此令y每增加1,x不变或者减少1,我们可以令:

2 、构造判别式

分析:

将M(xi-0.5,yi+1)点代入圆的稳式方程F(x,y)=X^2+Y^2-R^2

所以d=F(M)=(xi-0.5)^2+(yi+1)^2-R^2

由图可以分析:

可知当d<0时如图所示,在圆内,所以选择Pd


d>=0时,在圆外,所以选择Pu


3、求d的增量

分析:

当d<0时,取Pd

d1=F(M1)=(xi-0.5)^2+(yi+1)^2-R^2

d2=F(M2)=(xi-0.5)^2+(yi+2)^2-R^2

detad=d2-d1=2y+3


当d>=0时,取Pu

d1=F(M1)=(xi-0.5)^2+(yi+1)^2-R^2

d2=F(M2)=(xi-1.5)^2+(yi+2)^2-R^2

detad=d2-d1=2(yi-xi)+5


4、求d的初始值

分析:

d0=F(M0)=(R-0.5)^2+1-R^2=1.25-R


5、总结上述

分析:

d0=1.25-R

当d>=0时,取Pu:

detad=2(yi-xi)+5

x(i+1)=xi-1

y(i+1)=yi+1

当d<0时,取Pd:

detad=2y+3

x(i+1)=xi

y(i+1)=yi+1


6、matlab实现

主函数:(写的繁琐了,不过原理很简单)

clc;
clear all;
close all;
r=500;
X2=[];
Y2=[];
X1=[];
Y1=[];
d=1.25-r;
x=r;
y=0;
for i=1:r/sqrt(2)+1
    X2(i)=x;
    Y2(i)=y;
    if(d<0)
        d=d+2*y+3;
        x=x;
        y=y+1;

    else
         d=d+2*(y-x)+5;
         x=x-1;
         y=y+1;
    end
end
for i=1:r/sqrt(2)+1
    X1(i)=xzuobiao(X2(i),Y2(i)); 
    Y1(i)=yzuobiao(X2(i),Y2(i));
end
X3=X2;
Y3=-Y2;
X4=X1;
Y4=-Y1;
X5=-X1;
Y5=-Y1;
X6=-X2;
Y6=-Y2;
X7=-X2;
Y7=Y2;
X8=-X1;
Y8=Y1;
plot(X1,Y1);
hold on;
plot(X2,Y2);
hold on;
plot(X3,Y3);
hold on;
plot(X4,Y4);
hold on;
plot(X5,Y5);
hold on;
plot(X6,Y6);
hold on;
plot(X7,Y7);
hold on;
plot(X8,Y8);
title('R=500')

子函数:

第1区域的对称x点

function [XX]=xzuobiao(xx,yy)
syms Y X%先求垂足坐标
EQ1=(Y-yy)+(X-xx);%垂直
EQ2=X-Y;%在直线上
[XC YC]=solve(EQ1,EQ2);
XC2=double(XC);%垂足坐标
YC2=double(YC);
XX=2*XC2-xx;%利用中点公式求对称点
YY=2*YC2-yy;%利用中点公式求对称点

第1区域的对称y点

function [YY]=yzuobiao(xx,yy)
syms Y X%先求垂足坐标
EQ1=(Y-yy)+(X-xx);%垂直
EQ2=X-Y;%在直线上
[XC YC]=solve(EQ1,EQ2);
XC2=double(XC);%垂足坐标
YC2=double(YC);
XX=2*XC2-xx;%利用中点公式求对称点
YY=2*YC2-yy;%利用中点公式求对称点

7、算法效果

如有错误,欢迎指正!

发布了13 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wangcl1999/article/details/105139764