用sdk画三叶玫瑰曲线

首先要有一个整体的明确思路,画图肯定要知道比例尺,所谓的比例尺就是模拟图形和实际要绘画的图形之间的比例,我们知道实际图形的最大宽度和最大高度,再计算出模拟图形的最大宽度和最大高度,知道这两者就可以将模拟图形的任何一个点按比例尺计算到窗口坐标系中对应的值,所以,画图的首要条件是要知道比例尺,也就是模拟图和窗口图中的对应关系,才可以继续。
用一个循环两个判断,求出模拟图形的值域和定义域。然后用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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值