【计算机图形学】中点画线法实现焦点在x、y轴上的椭圆绘制
【计算机图形学】中点画线法实现焦点在x、y轴上的椭圆绘制
一、中点画线法原理简介
1.建立基础
- 中点画线法的原理介绍见直线绘制的博文中点画线法实现任意斜率直线的绘制。基本思路是以下一点在椭圆外/内的位置关系替换点在直线上/下关系。
2.具体分析
- 待补具体图例
二、代码实现
- 分析出椭圆右上部分、右下部分的中点画线方法,并将所得点关于y轴对称,得出整个椭圆图案。
/*
程序:中点画线法实现焦点在x\y轴上的椭圆绘制
编译环境:Visual C++ 6.0 EasyX_20200109(beta)
作者ID:weixin_43536824
邮箱:changye303@163.com
*/
#include <easyx.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
//情况1:画上部分(屏幕显示为下部分)
void GetOvalUp(double a,double b,double m,double n,int COLOR,int c){double x,y,d,xx,yy,l;double xp = m+pow(a,2)/sqrt(pow(a,2)+pow(b,2));double yp = n+pow(b,2)/sqrt(pow(a,2)+pow(b,2));double xpp = pow(a,2)/sqrt(pow(a,2)+pow(b,2));double ypp = pow(b,2)/sqrt(pow(a,2)+pow(b,2));double d10 = pow(a,2)*(0.25-b)+pow(b,2);double d20 = pow(b,2)*pow(xpp+0.5,2)+pow(a,2)*pow(ypp-1,2)-pow(a,2)*pow(b,2);//x <= xp:x = m;y = n+b;xx = 0;yy = b;moverel((int)x,(int)y);d = d10;while (x <= xp){if(d < 0){//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+3));x+= 1;xx+=1;}else{//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+3)+pow(a,2)*(2-2*yy));x+= 1;y-= 1;xx+= 1;yy-= 1;}}//x > xp:x = xp;y = yp;xx = xpp;yy = ypp;moverel((int)x,(int)y);d = d20;while(x >= xp && x <= m+a && y >= n ){if(d < 0){//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+2)+pow(a,2)*(3-2*yy));y-= 1;x+= 1;yy-= 1;xx+= 1;}else{//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= pow(a,2)*(3-2*yy);y-= 1;yy-= 1;}}
}
//画下部分(屏幕上显示为上部分)
void GetOvalDown(double a,double b,double m,double n,int COLOR,int c){double x,y,d,xx,yy,l;double xp = m+pow(a,2)/sqrt(pow(a,2)+pow(b,2));double yp = n-pow(b,2)/sqrt(pow(a,2)+pow(b,2));double xpp = pow(a,2)/sqrt(pow(a,2)+pow(b,2));double ypp = (-1)*(pow(b,2)/sqrt(pow(a,2)+pow(b,2)));double d10 = pow(a,2)*(0.25-b)+pow(b,2);double d20 = pow(b,2)*pow(xpp+0.5,2)+pow(a,2)*pow(ypp+1,2)-pow(a,2)*pow(b,2);//x <= xp:x = m;y = n-b;xx = 0;yy = -1*b;moverel((int)x,(int)y);d = d10;while (x <= xp){if(d < 0){//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+3));x+= 1;xx+= 1;}else{//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+3)+pow(a,2)*(2+2*yy));x+= 1;y+= 1;xx+= 1;yy+= 1;}}//x > xp:x = xp;y = yp;xx = xpp;yy = ypp;moverel((int)x,(int)y);d = d20;while(x >= xp && y <= n){if(d < 0){//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= (pow(b,2)*(2*xx+2)+pow(a,2)*(3+2*yy));y+= 1;x+= 1;yy+= 1;xx+= 1;}else{//若焦点在x轴上if(c==0){putpixel((int)x,(int)y,COLOR);l = x-m;putpixel((int)(m-l),(int)y,COLOR); }//若焦点在y轴上else{putpixel((int)y,(int)x,COLOR);l = x-m;putpixel((int)y,(int)(m-l),COLOR); }d+= pow(a,2)*(3+2*yy);y+= 1;yy+= 1;}}
}
//画椭圆函数
//c=0,画焦点在x轴上的椭圆
//c=1,画焦点在y轴上的椭圆
void GetOval(double a,double b,double m,double n,int COLOR,int c){GetOvalUp(a,b,m,n,COLOR,c);GetOvalDown(a,b,m,n,COLOR,c);
}
int main(){initgraph(500,500); //创建绘图窗口GetOval(200,100,250,250,WHITE,1);getch(); //按任意键继续closegraph(); //关闭绘图窗口return 0;
}
【计算机图形学】中点画线法实现焦点在x、y轴上的椭圆绘制相关推荐
- 图形学---中点画线法---opengl中实现
目的: 为了优化DDA算法中的浮点数运算(DDA中每次+k运算,|k|<1,所以存在浮点数运算),达到整数运算,提高效率. 基本思想: 当前像素点为(xp,yp),下一像素点为P1或P2.设P1 ...
- java实现计算机图形学中点画线算法
代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...
- 【计算机图形学|直线生成算法】中点画线法
文章目录 概述 一.基本思想 二.构造判别式: 三.递推出增量 优化: 总结: 四.例题分析 五.伪代码 概述 中点画线法(Midpoint Line Algorithm)是一种画线(Line Dra ...
- [计算机图形学算法]直线扫描转换算法-中点画线法
DDA算法用斜截式表示直线方程,简化了乘法运算,但任存在浮点运算. 我们猜想,用别的方式表示直线,是否能把浮点运算也简化为整数运算. 在中点画线法中,我们用Ax+By+C=0的一般式方程来表示直线,即 ...
- 【计算机图形学】中点画线法实现任意斜率直线的绘制
[计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...
- 中点画线法c语言程序,计算机图形学 :中点画圆法
由于安装了easyx的vc6.0只能用initgraph(x,y)初始化一个x*y的第一象限的画板.所以对于书上的画圆法我们需要稍微进行一点改变.这个算法只能画1/8的圆,其它7/8的圆只能通过对称关 ...
- 画毛毛虫代码计算机图形学,计算机图形学 实验 数值微分(DDA)法、中点画线法、Bresenham算法.doc...
文档介绍: 实验名称数值微分(DDA)法.中点画线法.Bresenham算法实验时间年月日专业姓名学号预****操作座位号教师签名总评一.实验目的:1.了解数值微分(DDA)法.中点画线法.Brese ...
- 图形学--(中点画线法+Bresenham画线算法)
编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color) 用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...
- 【OpenGL C++】画一个空心汉字和一个圆,并填充汉字(中点画线法,中点画圆法,种子填充法)
内容:画一个空心汉字和一个圆 设计一个画任意直线和圆的算法,可选所学的任一图形扫描转换算法(中点或bresenham算法),不能使用任何画线/画圆的API: 使用画线算法实现空心汉字的绘制,汉字必须为 ...
最新文章
- skiller v3 beta2_S10全球总决赛:赛前叫嚣却遭打脸!V3被LGD踢出S10,日本撸友彻底炸锅:真是悲哀...
- 【Kaggle-MNIST之路】CNN+改进过的损失函数(三)
- 虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File
- 个人计算机上常用的操作系统,个人计算机常用的输出设备 操作系统的发展史(3)...
- 浅谈C/C+内存管理、内存泄漏、堆栈
- excel检验是否是正态分布-T分布
- java class文件比较_java class文件查看工具
- 嘘——2021还没对象?你的虚拟女友已上线。
- 计算机怎么盲打键盘,键盘指法,教您盲打及快速打字指法练习的步骤
- 【微信小程序】获取Bmob后端云数据库某一数据表的所有记录
- 3.acwing3373. 进制转换
- deepin20.6设置默认的root密码
- hgetall php,HGETALL命令_视频讲解_用法示例-redis编程词典-php中文网
- 【Springboot+PageHelper】Springboot 添加PageHelper 分页
- 什么是镜像(mirror image )文件?
- 电脑软件系统等保2.0 二级安全要求
- 计算机网络知识点总结周报
- 移动UI 设计有哪些文字规范
- 错误代码如404、500{{1004}}
- Vue学习2 - 事件处理以及绑定、事件、遍历、判断、元素显示、DOM属性的绑定、comput计算属性值
热门文章
- 双11百元高性价比蓝牙耳机推荐,低延迟续航给力学生党蓝牙耳机分享
- 移动互联网思维(持续更新)
- 二维码对移动互联网的意义_阅读材料,完成下列要求。互联网思维,就是在(移动)互联网、大数据、云计算等科技不断发展的背景下,对市场、对用户、对产品、对企业价值链乃至对...
- Mac book pro2014 雷雳有线网络获取不到地址
- 批量修改文件夹下图片的名字
- Redis第二话 -- Redis的高端操作(发布订阅、事务、LUA脚本)
- VR社交软件测试-AltspaceVR
- IOS开发之国际化(中英语言版本设置)
- 刷机总结(pixel2)
- 汤小鲜和范小满注重产品口味和品质