Actual source code: ex7.c

  1: static char help[] = "Demonstrates drawing primitives in a window\n";

  3: #include <petscdraw.h>

  5: int main(int argc, char **argv)
  6: {
  7:   PetscDraw draw;

  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;

 19:   PetscFunctionBeginUser;
 20:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));

 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));

 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));

 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));

 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));

 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));

108:   PetscCall(PetscDrawDestroy(&draw));
109:   PetscCall(PetscFinalize());
110:   return 0;
111: }

113: /*TEST

115:    build:
116:      requires: x

118:    test:
119:      output_file: output/ex1_1.out

121: TEST*/