小甲鱼老师讲的第17节课后作业里面的那个极坐标在客户区找X,Y坐标不会求解答
本帖最后由 谦虚求学 于 2016-10-28 19:32 编辑/* -------------------------------------------------------------------
MyWindows.c -- 基本窗口模型
《Windows 程序设计(SDK)》视频教程
--------------------------------------------------------------------*/
#include <windows.h>
#include <math.h>
#include <strsafe.h>
#define PI 3.1415926 //圆周率
#define F(x)
#define R(theta)(sin(4 * theta)) //待作图函数【修改此处,可以得到不同的函数图】
#define P_MIN (0) //区间左端点
#define P_MAX (2 * PI) //区间右端点【修改此处及上处,可以得到不同的作图区间】
#define LIMIT 2 //最大坐标轴标度 【修改此处,可以对图像进行缩放】
#define S_NUM 360 //采样数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindows");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT("鱼C工作室"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int cxClient, cyClient;
POINT apt;
double theta;
int x, y, cxCenter, cyCenter;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
cxCenter = cxClient / 2;
cyCenter = cyClient / 2;
x = (int)(R(P_MIN) * cos(P_MIN) * cxCenter / LIMIT + cxCenter);
y = (int)(-1 * R(P_MIN) * sin(P_MIN) * cyCenter / LIMIT + cyCenter); //计算初始屏幕坐标
MoveToEx(hdc, x, y, NULL);
for (int i = 0; i < S_NUM; i++)
{
theta = (double)((P_MAX - P_MIN) * i / S_NUM + P_MIN);//计算角度
apt.x = (int)(R(theta) * cos(theta) * cxCenter / LIMIT + cxCenter);
apt.y = (int)(-1 * R(theta) * sin(theta) * cyCenter / LIMIT + cyCenter);//计算屏幕坐标
}
PolylineTo(hdc, apt, S_NUM);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
我数学不好 希望大神多多指教{:5_99:}
x=r*cos(角度)
y=r*sin(角度) alltolove 发表于 2016-10-28 19:36
x=r*cos(角度)
y=r*sin(角度)
你好啊 ,我想问的是在客户区X,Y坐标怎么定的点,或者说在客户区X,Y是如何初始化屏幕的 {:5_94:} alltolove 发表于 2016-10-28 19:36
x=r*cos(角度)
y=r*sin(角度)
谢谢 请给我文字 讲解下我数学 不好 {:5_100:} 客户区就是坐上角是0,0点,横坐标x纵坐标是y啊。。。
真的不会了
本帖最后由 谦虚求学 于 2016-10-29 19:10 编辑alltolove 发表于 2016-10-29 16:47
客户区就是坐上角是0,0点,横坐标x纵坐标是y啊。。。
感谢你的 回答 ,谢谢 ,就这个代码题而言,我在代码里用笔把我要问的哪个极坐标X,Y转化圈了起来 ,他们在客户区里花的折线定点问题,我知道客户区的基点在左上角 ,但是要画着个花,代码里说的计算初始屏幕坐标(X 和 Y )怎么在哪里定, 我真的不会了 , 你是说从新定位画面中间为x,y的0,0点吧? 用SetViewportOrgEx这个函数就可以。 alltolove 发表于 2016-10-29 21:57
你是说从新定位画面中间为x,y的0,0点吧? 用SetViewportOrgEx这个函数就可以。
谢谢你,我对客户区里比如 画一个东西 我对里面X,Y的定位问题很不懂 ,所以才问这样的问题,心里好无奈 啊,也没有个讲解客户区里画个 物件 定位的书或文章哎
页:
[1]