スポンサーサイト

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

直線で曲線を描く方法2


前回の直線で曲線を描く方法のプログラムを改良し

もう少しだけ綺麗で、見栄えの良いものを作りました。

実行ファイルとソースコードをzipにしたのでアップしときます。
http://u9.getuploader.com/SkyBlue/download/22/LinearCurve.zip

肝心のサムネイルは続きに張ります。


これが、直線で描く曲線だ。
LinearCurve2

どうです。この不思議物体。

なんとなーく、3DCGにも見える。けど2Dです。
3DCGなんて、まだまだ私には早い。
コレ作るのに4時間掛かったんだからwww

そして、以下に今回のソースコードを載せときます。
なんかの参考になればいいんだけどね。
ちなみにC++とWinAPIで書いてます。


/*
Linear_curve.cpp
2011/02/18
*/

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

#define WND_W 620
#define WND_H 634

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInst(HINSTANCE,int);
HDC MakeDC(HWND); //互換デバイスコンテキストの作成
void DrawLinearCurve(HDC); //描画処理
inline void DrawMark(HDC,int,int); //X・Y軸目盛描画

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;
ZeroMemory(&wc,sizeof(WNDCLASSEX));
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
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.lpszClassName=szClassName;
return RegisterClassEx(&wc);
}

BOOL InitInst(HINSTANCE hInst,int nCmdShow)
{
int sc_x=GetSystemMetrics(SM_CXSCREEN),sc_y=GetSystemMetrics(SM_CYSCREEN);

HWND hWnd=CreateWindow(szClassName,_T("Linear curve"),
WS_OVERLAPPEDWINDOW &~WS_THICKFRAME &~WS_MAXIMIZEBOX,
(sc_x-WND_W)/2,(sc_y-WND_H)/2,WND_W,WND_H,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)
{
static HDC hdc_mem=0;
PAINTSTRUCT ps;

switch(msg){
case WM_CREATE:
hdc_mem=MakeDC(hWnd);
DrawLinearCurve(hdc_mem);
break;
case WM_PAINT:
BeginPaint(hWnd,&ps);
BitBlt(ps.hdc,ps.rcPaint.left,ps.rcPaint.top,
ps.rcPaint.right-ps.rcPaint.left,
ps.rcPaint.bottom-ps.rcPaint.top,
hdc_mem,ps.rcPaint.left,ps.rcPaint.top,
SRCCOPY);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
DeleteDC(hdc_mem);
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}

HDC MakeDC(HWND hWnd)
{
HDC hdc=GetDC(hWnd);
HDC hdc_mem=CreateCompatibleDC(hdc);
HBITMAP hBmp=CreateCompatibleBitmap(hdc,WND_W,WND_H);
SelectObject(hdc_mem,hBmp);
DeleteObject(hBmp);
ReleaseDC(hWnd,hdc);
return hdc_mem;
}

void DrawLinearCurve(HDC hdc)
{
const int full=600,half=300,space=20;
int n=0;

HPEN hPen_white=(HPEN)GetStockObject(WHITE_PEN);
SelectObject(hdc,hPen_white);

//X・Y軸描画
MoveToEx(hdc,0,half,NULL);
LineTo(hdc,full,half);
MoveToEx(hdc,half,0,NULL);
LineTo(hdc,half,full);

//直線で曲線を描く部分
for(n=0;n<=half;n+=space){
MoveToEx(hdc,half,n,0);
LineTo(hdc,half+n,half);
MoveToEx(hdc,half,n,0);
LineTo(hdc,half-n,half);

MoveToEx(hdc,half,full-n,0);
LineTo(hdc,half+n,half);
MoveToEx(hdc,half,full-n,0);
LineTo(hdc,half-n,half);
}

//目盛描画
for(n=0;n<=full;n+=space){
DrawMark(hdc,n,half);//X軸
DrawMark(hdc,half,n);//Y軸
}
}

void DrawMark(HDC hdc,int x,int y)
{
const COLORREF cMark=RGB(0xff,0,0);

SetPixelV(hdc,x-1,y-1,cMark);
SetPixelV(hdc,x ,y-1,cMark);
SetPixelV(hdc,x+1,y-1,cMark);
SetPixelV(hdc,x-1,y ,cMark);
SetPixelV(hdc,x ,y ,cMark);
SetPixelV(hdc,x+1,y ,cMark);
SetPixelV(hdc,x-1,y+1,cMark);
SetPixelV(hdc,x ,y+1,cMark);
SetPixelV(hdc,x+1,y+1,cMark);
}
  1. 2011/02/18(金) 02:36:09|
  2. プログラミング
  3. | Track back:1
  4. | Comment:2

Comment

No.289

こう見ると3Dと2Dの違いがワカラン…
  1. 2011/02/19(土) 02:53:46 |
  2. URL |
  3. VARREL #-
  4. [ Edit]

No.288

これが直線だと!?!
素直にすごいw
  1. 2011/02/18(金) 14:35:36 |
  2. URL |
  3. クロさん #-
  4. [ Edit]

Post a comment

Only display to administrator.

Track back

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

まとめteみた.【直線で曲線を描く方法2】

前回の直線で曲線を描く方法のプログラムを改良しもう少しだけ綺麗で、見栄えの良いものを作りました。実行ファイルとソースコードをzipにしたのでアップしときます。http://u9.getuploader.com/SkyBlue/download/22/LinearCurve.zip肝心のサムネイルは続きに張ります。
  1. 2012/04/04(水) 12:41:12 |
  2. まとめwoネタ速suru