スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

直線で曲線を描く方法


昨日の夜に友人から直線で曲線を描く方法を教えてもらい。

面白かったのでプログラムにして紹介。

サムネ
LinearCurve

詳しくは続きから。


1.サムネ見てわかる通り、グラフの様にX,Y軸を書く

2.等間隔で点を打っていきます。紙面でやるなら0.5cm間隔で点を10個ぐらいが楽。

3.Y軸の一番上の点から、X軸の二つ目の点に向かって直線を引きます。(原点が一つ目とする)
  次はY軸の一番上から数えて2番目の点から
  X軸の三つ目の点に線を引きます。

と、3を繰り返していけば全ての点(原点抜き)どおしでつながるはず。
そうすれば見事な曲線ができる。

サムネイルのやつは潰れてて汚いですが、紙面上でやると綺麗にいきます。

それから、今回つくったプログラムのソースコードを以下に。

/*
Linear_curve.cpp
2011/02/17
*/

#define WIN32_LEAN_AND_MEAN

#include<Windows.h>
#include<tchar.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInst(HINSTANCE,int);
void DrawLinearCurve(HDC);

TCHAR szClassName[]=_T("Linear_curve");

int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;

if(!InitApp(hCurInst))return FALSE;
if(!InitInst(hCurInst,nCmdShow))return FALSE;

while(1){
if(GetMessage(&msg,NULL,0,0)<1)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_SHARED);
wc.hIconSm=(HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_SHARED);
wc.hCursor=(HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,0,0,LR_DEFAULTSIZE|LR_SHARED);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=szClassName;

return RegisterClassEx(&wc);
}

BOOL InitInst(HINSTANCE hInst,int nCmdShow)
{
HWND hWnd;

hWnd=CreateWindowEx(NULL,
szClassName,
_T("Linear curve"),
WS_OVERLAPPEDWINDOW &~WS_THICKFRAME &~WS_MAXIMIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,
800,600,
NULL,NULL,
hInst,NULL);
if(!hWnd)return FALSE;

ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;

switch(msg){
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
DrawLinearCurve(hdc);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}

void DrawLinearCurve(HDC hdc)
{
int n=0,m=0;
POINT p={0,0};

//X軸Y軸描画
MoveToEx(hdc,20,10,NULL);
LineTo(hdc,20,510);
LineTo(hdc,520,510);

//目盛描画
for(n=0,m=10;n<51;n++,m+=10){
SetPixelV(hdc,19,m,RGB(0xff,0,0));
SetPixelV(hdc,20,m,RGB(0xff,0,0));
}
for(n=0,m=20;n<51;n++,m+=10){
SetPixelV(hdc,m,510,RGB(0xff,0,0));
SetPixelV(hdc,m,511,RGB(0xff,0,0));
}

//直線で曲線を描く部分
for(n=0,p.x=20,p.y=10;n<50;n++,p.x+=10,p.y+=10){
MoveToEx(hdc,20,p.y,NULL);
LineTo(hdc,p.x,510);
}
}
  1. 2011/02/17(木) 15:45:25|
  2. プログラミング
  3. | Track back:0
  4. | Comment:1

Comment

No.287

芸術だ
  1. 2011/02/17(木) 19:26:02 |
  2. URL |
  3. VARREL #-
  4. [ Edit]

Post a comment

Only display to administrator.

Track back

Track Back URL
Track Back to this post(FC2 blog user)