MFC有理二次Bezier曲线绘制





非有理Bezier曲线曲线无法精确表示所有的二次曲线和二次曲面,引入了有理Bezier曲线曲面,来精确表示。如图,通过控制权重,可以获取不同的二次有理Bezier曲线(蓝色线条),虚线为非有理Bezier曲线,作为对照。
理论与算法参考《计算几何算法与实现》–孔令德
代码实现如下:

#pragma once
#include"P2.h"
#include"math.h"#define ROUND(h) int(h+0.5)
class RationalQuadraticBezier
{public:RationalQuadraticBezier(void);~RationalQuadraticBezier(void);void ReadPoint(void);//赋值控制点CP2 point[3];//控制点数组void DrawCurve(CDC*pDC);//绘制曲线void DrawControlPoint(CDC*pDC);//绘制控制点void RationalCurve(CDC*pDC);
};
#include "StdAfx.h"
#include "RationalQuadraticBezier.h"RationalQuadraticBezier::RationalQuadraticBezier(void)
{ReadPoint();
}RationalQuadraticBezier::~RationalQuadraticBezier(void)
{}void RationalQuadraticBezier::ReadPoint(void)
{point[0].x=-200,point[0].y=-100;point[1].x=0,point[1].y=100;point[2].x=200,point[2].y=-100;
}void RationalQuadraticBezier::DrawCurve(CDC*pDC)
{DrawControlPoint(pDC);//绘制控制点RationalCurve(pDC);//绘制有理二次Bezier样条
}void RationalQuadraticBezier::DrawControlPoint(CDC*pDC)
{CPen NewPen,*pOldPen;//画笔NewPen.CreatePen(PS_SOLID,3,RGB(0,0,0));pOldPen=pDC->SelectObject(&NewPen);CBrush NewBrush,*pOldBrush;pOldBrush=(CBrush*)pDC->SelectStockObject(BLACK_BRUSH);//画刷pDC->MoveTo(ROUND(point[0].x),ROUND(point[0].y));for(int i=0;i<3;i++){pDC->LineTo(ROUND(point[i].x),ROUND(point[i].y));pDC->Ellipse(ROUND(point[i].x)-5,ROUND(point[i].y)-5,ROUND(point[i].x)+5,ROUND(point[i].y)+5);}pDC->SelectObject(pOldBrush);pDC->SelectObject(pOldPen);
}void RationalQuadraticBezier::RationalCurve(CDC*pDC)
{CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=pDC->SelectObject(&NewPen);double Bern02,Bern12,Bern22;//定义伯恩斯坦基函数double weight0=1.0,weight2=1.0,weight1=-0.5;//权因子赋值double tStep=0.01;//绘制步长pDC->MoveTo(ROUND(point[0].x),ROUND(point[0].y));for(double t=0;t<=1.0;t=t+tStep){Bern02=(1-t)*(1-t);//伯恩斯坦基函数值Bern12=2*t*(1-t);Bern22=t*t;CP2 tempPoint(0,0);//计算插值点double denominator=Bern02*weight0+Bern12*weight1+Bern22*weight2;//分母tempPoint.x=(Bern02*weight0*point[0].x+Bern12*weight1*point[1].x+Bern22*weight2*point[2].x)/denominator;//分子/分母tempPoint.y=(Bern02*weight0*point[0].y+Bern12*weight1*point[1].y+Bern22*weight2*point[2].y)/denominator;pDC->LineTo(ROUND(tempPoint.x),ROUND(tempPoint.y));}pDC->SelectObject(pOldPen);
}

MFC有理二次Bezier曲线绘制相关推荐

  1. MFC有理二次Bezier曲线精确拟合圆

    MFC有理二次Bezier曲线精确拟合圆 见蓝色线条,相比较与无理Bezier曲线,有理Bezier曲线可以精确拟合圆等二次线条. 控制点的赋值为: int r=200;//圆的半径point[0][ ...

  2. 构造一条二次bezier曲线_那些处处连续,处处不可导的曲线

    来源公众号:数学之美 链接:那些处处连续,处处不可导的曲线 01.魏尔斯特拉斯函数 数学家们早就知道,一个可导的函数必定是连续的,但反之不然.像y=|x|这样的函数,是处处连续的,它在x=0处突然改变 ...

  3. bezier 曲线的绘制 matlab实现

    Bezier曲线的定义如下: 下面用matlab实现Bezier曲线的绘制: 1.绘制二维bezier曲线代码如下: function [X,Y]=bezier2(x,y) %用法: %bezier( ...

  4. 【计算机图形学】-二维曲线绘制实验 (code included)

    1. 实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2. 实验内容: (1) 结合示范代码理解曲线生成原理与算法实现,尤其是Bezi ...

  5. html中地图的绘制toolbars,tkinter内嵌Matplotlib系列(二)之函数曲线绘制

    目录 前言 前一章节,我们解读了tkinter内嵌Matplotlib的教程,了解其内嵌的原理,就是在tkinter创建matplotlib的画布控件,再利用其返回的画布对象进行绘图,其他附加功能,使 ...

  6. 三次bezier曲线 MATLAB,Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线

    <Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线>由会员分享,可在线阅读,更多相关<Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线(3页珍藏版)& ...

  7. 【Python】Bezier曲线的绘制

    Bezier曲线的绘制 r(u)=∑iJn,i(u)Vir(u) = \sum_i{J_{n,i}(u)V_i}r(u)=∑i​Jn,i​(u)Vi​ Jn,i=Cniui(1−u)n−iJ_{n,i ...

  8. 二分类及多分类ROC和PR曲线绘制

    目录 1.二分类曲线 1.1 二分类ROC曲线 1.2 二分类PR曲线 2.多分类曲线 2.1多分类ROC曲线 2.2 多分类PR曲线 前两天2022年第二届全国高校大数据竞赛已经落下帷幕,比赛中也用 ...

  9. bezier曲线_Bezier算法

    个人博客: vectormoon's blog​www.vectormoon.net bezier算法的背景 vm公司设计出了一个原型车--moon,这样的: 产品经理一看觉得有点抽象,他使用了Bez ...

最新文章

  1. linux 用户java_linux之用户管理
  2. 吐槽 | 聊一聊公众号的那些事
  3. 正則表達式截取字符串两字符间的内容
  4. js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource
  5. 《MyBatis技术原理与实战》之动态SQL
  6. Nim 游戏 、⽯头游戏1、石头游戏2
  7. mysql delete 会锁表吗_MySQL高压缩引擎TokuDB 揭秘
  8. java调用js查询mongo_mongodb操作之使用javaScript实现多表关联查询
  9. 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型
  10. 智能行业热点速览(2019.7.15)
  11. Ngnix的日志管理和用定时任务完成日志切割
  12. linux伪造ip数据包,伪造ICMP数据包的IP层
  13. 高通通过adb一键进入9008端口模式
  14. 彻底解决mac os 下javac Java命令行工具乱码问题
  15. java 群发邮件_java群发邮件
  16. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述...
  17. 误差卡尔曼中的四元数运动学-第二章
  18. Reverses the digits of an integer mathmatically
  19. T---EXCEL表格换行
  20. 不显示藏宝阁试穿服务器,梦幻西游:真的感谢藏宝阁的试穿系统,圆了我拥有无级别的梦...

热门文章

  1. Centos6.8安装Nginx
  2. Vue2--非父子组件通信笔记
  3. 批量删除EXCEL里的软回车
  4. linux 4g 模块 中兴,中兴ZTE 4G模块 ME3610 FDD模块
  5. 《AANet: Adaptive Aggregation Network for Efficient Stereo Matching》
  6. 手工破解windows密码
  7. 用Exchange 2000开发企业办公自动化系统
  8. [置顶] 基于视频采集卡驱动的错误修改CX26828
  9. 苹果手机怎么定位安卓手机_苹果手机一定比安卓手机强?我反倒觉得安卓吊打苹果!...
  10. 【车载开发系列】诊断故障码DTC的格式标识符