xref: /petsc/src/sys/classes/draw/tests/ex7.c (revision 609caa7c8c030312b00807b4f015fd827bb80932)
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