首先要有一个整体的明确思路,画图肯定要知道比例尺,所谓的比例尺就是模拟图形和实际要绘画的图形之间的比例,我们知道实际图形的最大宽度和最大高度,再计算出模拟图形的最大宽度和最大高度,知道这两者就可以将模拟图形的任何一个点按比例尺计算到窗口坐标系中对应的值,所以,画图的首要条件是要知道比例尺,也就是模拟图和窗口图中的对应关系,才可以继续。
用一个循环两个判断,求出模拟图形的值域和定义域。然后用GetClientRect(hwnd,&rectClient);取得了窗口的当前宽度和当前高度信息。知道这两者思路可以继续。

其次,将极坐标转化为逻辑坐标然后计算1000个点,r=cos(3t);转化成逻辑坐标为,x=cos(3t)*cos(t); y=cos(3t)*sin(t);计算出来的点保存在double类型的数组里面。

最重要的一步其实是逻辑坐标到设备坐标的转换,我的理解,逻辑坐标是一个虚拟坐标,说白了是客户在纸上画图所用的坐标,设备坐标是在电脑上绘制图形所使用的坐标系。再明白一点,一个是自己想的虚拟的坐标系,一个是屏幕上要显示的能看到的坐标系。
apt[i].x = (long)((lyc - y[i]) * K + dxc);
apt[i].y = (long)((lxc - x[i]) * K + dyc);
这两句的含义就是将逻辑坐标下,图形的中心点与图形上个点的距离求出来,然后按比例系数转化到设备坐标下,再把设备坐标的中心加上这个距离,这样就完成了逻辑坐标到设备坐标的转换。
一共用到了3个步骤,
第一:确定比例尺;
第二:计算图形点,逻辑坐标系中心点和设备坐标系中心点;
第三:按比例尺将图形逻辑坐标点转化成设备坐标系中心点;

附上源代码:

/******************************************************************************\
画三叶曲线
\******************************************************************************/
void DrawRose(HWND hwnd)
{
HDC hdc = GetDC(hwnd);
HPEN penNew = CreatePen(PS_SOLID,0,RGB(255,0,0));
HPEN penOld = SelectObject(hdc,penNew);
double x[NUM],y[NUM]; //三叶玫瑰线在逻辑坐标系下的坐标
POINT apt[NUM]; //三叶玫瑰线在设备坐标系下的坐标
double a; //极角
double r; //极径
double xMin = 0.0; //三叶玫瑰线在逻辑坐标系下的范围 xMin xMax yMin yMax
double xMax = 0.0;
double yMin = 0.0;
double yMax = 0.0;
int i;
double Kx,Ky; //横向、纵向比例尺
double K; //横向、纵向比例尺中的最小值,也是比例尺
double lxc,lyc; //显示范围中心点的逻辑坐标
int dxc,dyc; //显示范围中心点的设备坐标
RECT rectClient;

GetClientRect(hwnd,&rectClient);
dxc = rectClient.right >> 1;
dyc = rectClient.bottom >> 1;

//首先计算逻辑坐标
for (i = 0 ; i < NUM ; i++)
{
a = i * TWOPI / NUM; //极角
r = cos(3.0 * a); //极径
x[i] = r * cos(a); //逻辑x坐标
if(x[i] < xMin)
{
xMin = x[i];
}
else if(x[i] > xMax)
{
xMax = x[i];
}
y[i] = r * sin(a); //逻辑y坐标
if(y[i] < yMin)
{
yMin = y[i];
}
else if(y[i] > yMax)
{
yMax = y[i];
}
}
//确定比例尺 K
Kx = rectClient.right / (yMax - yMin);
Ky = rectClient.bottom / (xMax - xMin);
if(Kx < Ky)
{
K = Kx;
}
else
{
K = Ky;
}
lxc = (xMin + xMax) * 0.5;
lyc = (yMin + yMax) * 0.5;
//将逻辑坐标转换为设备坐标
for (i = 0 ; i < NUM ; i++)
{
apt[i].x = (long)((lyc - y[i]) * K + dxc);
apt[i].y = (long)((lxc - x[i]) * K + dyc);
}
Polyline(hdc, apt, NUM);
SelectObject(hdc,penOld);
DeleteObject(penNew);
ReleaseDC(hwnd,hdc);
}

用sdk画三叶玫瑰曲线相关推荐

  1. 用matlab画三叶玫瑰,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function plot_rose draw_main(450,90); function draw_main(x,y) %粉红色玫瑰 arcdata{ ...

  2. java四叶玫瑰_java编一个四叶玫瑰曲线 不显示曲线

    //引入标准的类库importjava.awt.*;importjava.awt.event.*;importjava.awt.Color;//定义主类Case_1_1publicclassCase_ ...

  3. matlab 绘制极坐标三叶玫瑰线,几何画板如何画三叶玫瑰线?

    根据三角函数的特性可知,玫瑰线是一种具有周期性且包络线为圆弧的曲线,曲线的几何结构取决于方程参数的取值,不同的参数决定了玫瑰线的大小.叶子的数目和周期的可变性.其极坐标方程可以表示为:ρ=a* sin ...

  4. js绘制的漂亮玫瑰曲线rose curve

    js绘制的漂亮玫瑰曲线rose curve,在数学上 玫瑰 或 罗多纳 曲线 是用极坐标绘制的正弦曲线.基本极性方程是 r = a sin(kθ) 这些曲线是由意大利数学家命名的 Guido Gran ...

  5. OpenGL画蜗型线、心形线、三叶曲线、四叶曲线、螺旋线

    这里讲的是一些有趣而美丽的曲线,蜗型线.心形线.三叶曲线.四叶曲线.螺旋线等,都是由圆公式的一些特殊的变化带来的,我们使用了参数极坐标方程来计算曲线路径的点,这些点用做显示弧的逼近折现中直线段的端点. ...

  6. python绘制玫瑰曲线_数学的有趣图形-玫瑰线

    玫瑰线的说法源于欧洲海图.在中世纪的航海地图上,并没有经纬线,有的只是一些从中心有序地向外辐射的互相交叉的直线方向线.此线也称罗盘线,希腊神话里的各路风神被精心描绘在这些线上,作为方向的记号.葡萄牙水 ...

  7. 特殊的数独身数,:水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗七星数, 八仙数, 九九重阳数 ,十全十美数...

    特殊的数 你听过一些特殊的数码,如:独身数, 水仙花数, 四叶玫瑰数, 五角星数, 六合数 ,北斗×××数,  八仙数, 九九重阳数 ,十全十美数.说到这你是否和我当初一样好奇呢,这是什么数呢!总的概 ...

  8. bezier.CSS_SVG_canvas画_贝兹曲线

    ZC:(1).SVG可以绘制 贝兹曲线:(2).canvas能绘制 贝兹曲线:(3).现在(20180202)查资料发现,css 貌似不能绘制 贝兹曲线,css使用贝兹曲线 主要是用于控制动画的速度, ...

  9. html贝塞尔曲线在线,【HTML+js+纯前端】三次方贝塞尔曲线手工拟合小工具

    本帖最后由 南郊居士 于 2020-2-18 23:38 编辑 2020.2.18 重要修正: 1. 修正了当图样长宽不同时不能正确显示各控制点的问题. (一整天了都没人吐槽这个问题,看来这个工具还真 ...

最新文章

  1. 滴滴CEO程维:当初把产品拿给美团王兴看,他说了两个字“垃圾”!
  2. 【读书笔记】 网页关闭确认框
  3. 20210122发文补充截图
  4. 比起月薪过万的程序员大多数人居然选择了月薪3K的公务员?
  5. PerlTidy的配置项
  6. Android Lazy url
  7. 联想内部工程师 Vista自学手册
  8. 第四章:滚动堆栈(6)
  9. 澜舟科技开源轻量级中文语言预训练模型——孟子模型
  10. ps排版html,排版教程,超详细适合初学者的排版教程
  11. 怎么样开启移动热点?看我操作,简单开启
  12. BufferedReader.readLine() 日文乱码
  13. Linux I/O编程 实验内容
  14. 双绞线接头(RJ45)连接方法详解
  15. 快消品B2B平台的仓储物流模式
  16. 汇编语言程序设计 --- 一元二次方程ax2+bx+c=0求解(含注释详细源代码)
  17. 职工信息管理系统(链表版)
  18. Js判断ie浏览器版本
  19. 用Process启动和停止本地系统进程(打开关闭Excel,IE)
  20. 争用期51.2us和最小帧长512比特算法

热门文章

  1. 高职计算机专业英语词汇,职高英语单词复习
  2. 华为鸿蒙系统界面亮相,比Android操作更简单。
  3. LSTM对股票的收益进行预测(Keras实现)
  4. Spring 依赖注入的理解及三种注入方式
  5. Gym 103117 Problem - Spicy Restaurant
  6. 预计一季度国内手机市场下滑逾30%;美国或取诺基亚爱立信控
  7. Hyperf Casbin适配于Hyperf 的开源访问控制框架Casbin
  8. 个人日记-学习究竟是什么读后感4-2020/7/19
  9. android高仿京东秒杀,Android通过实现GridView的横向滚动实现仿京东秒杀效果
  10. 曾经山寨手机上的跨平台方案