1 static char help[] = "Demonstrates drawing primitives in a window\n";
2
3 #include <petscdraw.h>
4
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7 PetscDraw draw;
8
9 int i, j, w, h;
10 int k = PETSC_DRAW_BLACK;
11 int r = PETSC_DRAW_RED;
12 int g = PETSC_DRAW_GREEN;
13 int b = PETSC_DRAW_BLUE;
14 int y = PETSC_DRAW_YELLOW;
15 int c0 = PETSC_DRAW_BASIC_COLORS;
16 int c2 = 255;
17 int c1 = (c0 + c2) / 2;
18
19 PetscFunctionBeginUser;
20 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
21
22 PetscCall(PetscDrawCreate(PETSC_COMM_WORLD, 0, "Draw Example", PETSC_DECIDE, PETSC_DECIDE, 101, 101, &draw));
23 /* PetscCall(PetscDrawSetPause(draw,2.0)); */
24 PetscCall(PetscDrawSetFromOptions(draw));
25
26 PetscCall(PetscDrawCheckResizedWindow(draw));
27 PetscCall(PetscDrawGetWindowSize(draw, &w, &h));
28 PetscCall(PetscDrawSetCoordinates(draw, 0, 0, --w, --h));
29 PetscCall(PetscDrawClear(draw));
30 /* one-pixel lines in the window corners */
31 PetscCall(PetscDrawLine(draw, 0, 0, 0, 0, r));
32 PetscCall(PetscDrawLine(draw, w, 0, w, 0, r));
33 PetscCall(PetscDrawLine(draw, 0, h, 0, h, r));
34 PetscCall(PetscDrawLine(draw, w, h, w, h, r));
35 /* border lines with two pixels from borders */
36 PetscCall(PetscDrawLine(draw, 0 + 2, 0, w - 2, 0, k));
37 PetscCall(PetscDrawLine(draw, 0 + 2, h, w - 2, h, k));
38 PetscCall(PetscDrawLine(draw, 0, 0 + 2, 0, h - 2, k));
39 PetscCall(PetscDrawLine(draw, w, 0 + 2, w, h - 2, k));
40 /* oblique lines */
41 PetscCall(PetscDrawLine(draw, 0 + 2, h / 2, w - 2, h - 2, b));
42 PetscCall(PetscDrawLine(draw, 0 + 1, h - 1, w - 1, 0 + 1, b));
43 /* vertical up and down arrow, two pixels from borders */
44 PetscCall(PetscDrawArrow(draw, 1 * w / 4, 0 + 2, 1 * w / 4, h - 2, g));
45 PetscCall(PetscDrawArrow(draw, 3 * w / 4, h - 2, 3 * w / 4, 0 + 2, g));
46 /* horizontal right and left arrow, two pixels from borders */
47 PetscCall(PetscDrawArrow(draw, 0 + 2, 3 * h / 4, w - 2, 3 * h / 4, g));
48 PetscCall(PetscDrawArrow(draw, w - 2, 1 * h / 4, 0 + 2, 1 * h / 4, g));
49 /* flush, save, and pause */
50 PetscCall(PetscDrawFlush(draw));
51 PetscCall(PetscDrawSave(draw));
52 PetscCall(PetscDrawPause(draw));
53
54 PetscCall(PetscDrawCheckResizedWindow(draw));
55 PetscCall(PetscDrawGetWindowSize(draw, &w, &h));
56 PetscCall(PetscDrawSetCoordinates(draw, 0, 0, --w, --h));
57 PetscCall(PetscDrawClear(draw));
58 /* one-pixel rectangles in the window corners */
59 PetscCall(PetscDrawRectangle(draw, 0, 0, 0, 0, k, k, k, k));
60 PetscCall(PetscDrawRectangle(draw, w, 0, w, 0, k, k, k, k));
61 PetscCall(PetscDrawRectangle(draw, 0, h, 0, h, k, k, k, k));
62 PetscCall(PetscDrawRectangle(draw, w, h, w, h, k, k, k, k));
63 /* border rectangles with two pixels from borders */
64 PetscCall(PetscDrawRectangle(draw, 0 + 2, 0, w - 2, 0, k, k, k, k));
65 PetscCall(PetscDrawRectangle(draw, 0 + 2, h, w - 2, h, k, k, k, k));
66 PetscCall(PetscDrawRectangle(draw, 0, 0 + 2, 0, h - 2, k, k, k, k));
67 PetscCall(PetscDrawRectangle(draw, w, 0 + 2, w, h - 2, k, k, k, k));
68 /* more rectangles */
69 PetscCall(PetscDrawRectangle(draw, 0 + 2, 0 + 2, w / 2 - 1, h / 2 - 1, b, b, b, b));
70 PetscCall(PetscDrawRectangle(draw, 0 + 2, h / 2 + 1, w / 2 - 1, h - 2, r, r, r, r));
71 PetscCall(PetscDrawRectangle(draw, w / 2 + 1, h / 2 + 1, w - 2, h - 2, g, g, g, g));
72 PetscCall(PetscDrawRectangle(draw, w / 2 + 1, 0 + 2, w - 2, h / 2 - 1, y, y, y, y));
73 /* flush, save, and pause */
74 PetscCall(PetscDrawFlush(draw));
75 PetscCall(PetscDrawSave(draw));
76 PetscCall(PetscDrawPause(draw));
77
78 PetscCall(PetscDrawCheckResizedWindow(draw));
79 PetscCall(PetscDrawGetWindowSize(draw, &w, &h));
80 PetscCall(PetscDrawSetCoordinates(draw, 0, 0, --w, --h));
81 PetscCall(PetscDrawClear(draw));
82 /* interpolated triangles, one pixel from borders */
83 PetscCall(PetscDrawTriangle(draw, 0 + 1, 0 + 1, w - 1, 0 + 1, w - 1, h - 1, c0, c1, c2));
84 PetscCall(PetscDrawTriangle(draw, 0 + 1, 0 + 1, 0 + 1, h - 1, w - 1, h - 1, c0, c1, c2));
85 /* interpolated triangle, oblique, inside canvas */
86 PetscCall(PetscDrawTriangle(draw, w / 4, h / 4, w / 2, 3 * h / 4, 3 * w / 4, h / 2, c2, c1, c0));
87 /* flush, save, and pause */
88 PetscCall(PetscDrawFlush(draw));
89 PetscCall(PetscDrawSave(draw));
90 PetscCall(PetscDrawPause(draw));
91
92 PetscCall(PetscDrawCheckResizedWindow(draw));
93 PetscCall(PetscDrawGetWindowSize(draw, &w, &h));
94 PetscCall(PetscDrawSetCoordinates(draw, 0, 0, --w, --h));
95 PetscCall(PetscDrawClear(draw));
96 /* circles and ellipses */
97 PetscCall(PetscDrawEllipse(draw, w / 2, h / 2, w - 1, h - 1, r));
98 PetscCall(PetscDrawEllipse(draw, w, h / 2, w / 2, h, g));
99 PetscCall(PetscDrawEllipse(draw, 0, 0, w, h / 2, b));
100 PetscCall(PetscDrawEllipse(draw, w / 4, 3 * h / 4, w / 2, h / 4, y));
101 PetscCall(PetscDrawCoordinateToPixel(draw, w / 2, h / 2, &i, &j));
102 PetscCall(PetscDrawPointPixel(draw, i, j, k));
103 /* flush, save, and pause */
104 PetscCall(PetscDrawFlush(draw));
105 PetscCall(PetscDrawSave(draw));
106 PetscCall(PetscDrawPause(draw));
107
108 PetscCall(PetscDrawDestroy(&draw));
109 PetscCall(PetscFinalize());
110 return 0;
111 }
112
113 /*TEST
114
115 build:
116 requires: x
117
118 test:
119 output_file: output/empty.out
120
121 TEST*/
122