LINUX.ORG.RU

[студет] Cairo и закрашивание


0

0

Здравствуйте.

Хочу нарисовать несколько циклоид с общей точкой. Одна циклоида получается без проблем. http://pic.ipicture.ru/uploads/090419/9RAeZZRvWA.jpg

При добавлении второй циклоиды наблюдаю немного некрасивую картину. http://pic.ipicture.ru/uploads/090419/MSSjDFpQ3O.jpg

Каким образом избавиться от закрашивания и оставить только контуры? Поискал в документации такие моменты, на сколько мне позволил мой английский. Но ничего не нашел.

double x, y, t;
int a=3;

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 1.0);
cairo_move_to (cr, 320, 0);
cairo_line_to (cr,320 ,480);
cairo_move_to (cr, 0, 240);
cairo_line_to (cr,640 ,240);
cairo_stroke (cr);

cairo_translate (cr, 320, 240);

cairo_move_to (cr, 0, 0);

for(t=0; t<=100; t=t+0.01){
x=a*sin(t)*(1+cos(t));
y=a*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);

x=10*sin(t)*(1+cos(t));
y=10*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);
}

cairo_stroke (cr);

Ответ на: комментарий от unrealix

> Товарисч, это кардиоида, а не циклоида :)
Чорт. Запутался при написании.

> А то по куску не совсем понятно

Как-раз только в куске это и рисуется. Но если вам интересно еще и "рисование" окошка, то пожалуйста.

/**
cairo-gdi-demo.cpp

Demonstrates how to get Cairo Graphics working with the Windows API and GDI.

Author: Andrew Lim
Email: danteshamest@gmail.com
Site: windrealm.com
*/

#include <windows.h>
#include <cmath>
#include "cairo-win32.h"

/**
Gradient demonstration.
Taken from http://cairographics.org/samples/
*/
void gradientExample( cairo_t* cr ) {
double x, y, t;
int a=3;

cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
cairo_set_line_width (cr, 1.0);
cairo_move_to (cr, 320, 0);
cairo_line_to (cr,320 ,480);
cairo_move_to (cr, 0, 240);
cairo_line_to (cr,640 ,240);
cairo_stroke (cr);

cairo_translate (cr, 320, 240);

cairo_move_to (cr, 0, 0);

for(t=0; t<=100; t=t+0.01){
x=a*sin(t)*(1+cos(t));
y=a*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);

x=10*sin(t)*(1+cos(t));
y=10*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);
}

cairo_stroke (cr);
}

/**
Changes the dimensions of a window's client area.
*/
void SetClientSize( HWND hwnd, int clientWidth, int clientHeight ) {
if ( IsWindow( hwnd ) ) {
DWORD dwStyle = GetWindowLongPtr( hwnd, GWL_STYLE ) ;
DWORD dwExStyle = GetWindowLongPtr( hwnd, GWL_EXSTYLE ) ;
HMENU menu = GetMenu( hwnd ) ;
RECT rc = { 0, 0, clientWidth, clientHeight } ;
AdjustWindowRectEx( &rc, dwStyle, menu ? TRUE : FALSE, dwExStyle );
SetWindowPos( hwnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
SWP_NOZORDER | SWP_NOMOVE ) ;
}
}

/**
Handles WM_PAINT.
*/
LRESULT onPaint( HWND hwnd, WPARAM wParam, LPARAM lParam ) {
PAINTSTRUCT ps ;
HDC hdc = BeginPaint( hwnd, &ps );

// Create the cairo surface and context.
cairo_surface_t *surface = cairo_win32_surface_create (hdc);
cairo_t *cr = cairo_create (surface);

// Draw on the cairo context.
gradientExample( cr );

// Cleanup.
cairo_destroy (cr);
cairo_surface_destroy (surface);

EndPaint( hwnd, &ps );
return 0 ;
}

/**
Handles WM_CLOSE.
*/
LRESULT onClose( HWND hwnd, WPARAM wParam, LPARAM lParam ) {
PostQuitMessage( 0 );
return 0 ;
}

/**
Handles our window's messages.
*/
LRESULT CALLBACK WndProc( HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam ) {
switch(msg) {
case WM_PAINT: return onPaint( hwnd, wParam, lParam );
case WM_CLOSE: return onClose( hwnd, wParam, lParam );
default: return DefWindowProc(hwnd,msg,wParam,lParam);
}
}

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR args, int nShow ) {
MSG msg ;
WNDCLASS wc = {0};
wc.lpszClassName = TEXT( "CairoGdiWndClass" );
wc.hInstance = hInst ;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc ;
wc.hCursor = LoadCursor(0,IDC_ARROW);

RegisterClass(&wc);
HWND hwnd = CreateWindow( wc.lpszClassName,TEXT("Cairo & GDI Demo"),
WS_OVERLAPPEDWINDOW, 0,0,256,256,0,0,hInst,0);
SetClientSize( hwnd, 640, 480);
ShowWindow( hwnd, SW_SHOWNORMAL );

while( GetMessage(&msg,0,0,0) > 0 ) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

artishka
() автор топика
Ответ на: комментарий от artishka

>for(t=0; t<=100; t=t+0.01){
>x=a*sin(t)*(1+cos(t));

>y=a*cos(t)*(1+cos(t));

>cairo_line_to (cr,x*10,y*10);


>x=10*sin(t)*(1+cos(t));

>y=10*cos(t)*(1+cos(t));

>cairo_line_to (cr,x*10,y*10);

>}


for(t=0; t<=100; t=t+0.01){
x=a*sin(t)*(1+cos(t));
y=a*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);
}

cairo_move_to (cr, 0, 0);

for(t=0; t<=100; t=t+0.01){
x=10*sin(t)*(1+cos(t));
y=10*cos(t)*(1+cos(t));
cairo_line_to (cr,x*10,y*10);
}

может так заработает, с cairo не работвл ни разу

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

> может так заработает, с cairo не работвл ни разу
Оно самое. Спасибо большое.

artishka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.