1 static char help[] = "Demonstrates drawing primitives in a window\n"; 2 3 #include <petscdraw.h> 4 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