xref: /petsc/src/sys/classes/draw/interface/drect.c (revision 3f02e49b19195914bf17f317a25cb39636853415)
1 #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
2 
3 /*@C
4   PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a `PetscDraw`
5 
6   Not Collective
7 
8   Input Parameters:
9 + draw      - a `PetscDraw`
10 . xmin      - region to draw indicator function
11 . xmax      - region to draw indicator function
12 . ymin      - region to draw indicator function
13 . ymax      - region to draw indicator function
14 . c         - the color of the region
15 . indicator - the indicator function
16 - ctx       - the context to pass to the indicator function
17 
18   Level: developer
19 
20 .seealso: `PetscDraw`
21 @*/
22 PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax, int c, PetscErrorCode (*indicator)(void *, PetscReal, PetscReal, PetscBool *), void *ctx)
23 {
24   int       i, j, xstart, ystart, xend, yend;
25   PetscReal x, y;
26   PetscBool isnull, flg;
27 
28   PetscFunctionBegin;
29   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
30   PetscCall(PetscDrawIsNull(draw, &isnull));
31   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
32 
33   PetscCall(PetscDrawCoordinateToPixel(draw, xmin, ymin, &xstart, &ystart));
34   PetscCall(PetscDrawCoordinateToPixel(draw, xmax, ymax, &xend, &yend));
35   if (yend < ystart) {
36     int tmp = ystart;
37     ystart  = yend;
38     yend    = tmp;
39   }
40 
41   for (i = xstart; i <= xend; i++) {
42     for (j = ystart; j <= yend; j++) {
43       PetscCall(PetscDrawPixelToCoordinate(draw, i, j, &x, &y));
44       PetscCall(indicator(ctx, x, y, &flg));
45       if (flg) PetscCall(PetscDrawPointPixel(draw, i, j, c));
46     }
47   }
48   PetscFunctionReturn(PETSC_SUCCESS);
49 }
50 
51 /*@
52   PetscDrawCoordinateToPixel - given a coordinate in a `PetscDraw` returns the pixel location
53 
54   Not Collective
55 
56   Input Parameters:
57 + draw - the draw where the coordinates are defined
58 . x    - the horizontal coordinate
59 - y    - the vertical coordinate
60 
61   Output Parameters:
62 + i - the horizontal pixel location
63 - j - the vertical pixel location
64 
65   Level: developer
66 
67 .seealso: `PetscDraw`
68 @*/
69 PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw, PetscReal x, PetscReal y, int *i, int *j)
70 {
71   PetscFunctionBegin;
72   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
73   PetscUseTypeMethod(draw, coordinatetopixel, x, y, i, j);
74   PetscFunctionReturn(PETSC_SUCCESS);
75 }
76 
77 /*@
78   PetscDrawPixelToCoordinate - given a pixel in a `PetscDraw` returns the coordinate
79 
80   Not Collective
81 
82   Input Parameters:
83 + draw - the draw where the coordinates are defined
84 . i    - the horizontal pixel location
85 - j    - the vertical pixel location
86 
87   Output Parameters:
88 + x - the horizontal coordinate
89 - y - the vertical coordinate
90 
91   Level: developer
92 
93 .seealso: `PetscDraw`
94 @*/
95 PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw, int i, int j, PetscReal *x, PetscReal *y)
96 {
97   PetscFunctionBegin;
98   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
99   PetscUseTypeMethod(draw, pixeltocoordinate, i, j, x, y);
100   PetscFunctionReturn(PETSC_SUCCESS);
101 }
102 
103 /*@
104   PetscDrawRectangle - draws a rectangle onto a `PetscDraw` object
105 
106   Not Collective
107 
108   Input Parameters:
109 + draw - the drawing context
110 . xl   - coordinates of the lower left corner
111 . yl   - coordinates of the lower left corner
112 . xr   - coordinate of the upper right corner
113 . yr   - coordinate of the upper right corner
114 . c1   - the color of the first corner
115 . c2   - the color of the second corner
116 . c3   - the color of the third corner
117 - c4   - the color of the fourth corner
118 
119   Level: beginner
120 
121 .seealso: `PetscDraw`, `PetscDrawLine()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
122           `PetscDrawMarker()`, `PetscDrawPoint()`, `PetscDrawString()`, `PetscDrawArrow()`
123 @*/
124 PetscErrorCode PetscDrawRectangle(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c1, int c2, int c3, int c4)
125 {
126   PetscFunctionBegin;
127   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
128   PetscUseTypeMethod(draw, rectangle, xl, yl, xr, yr, c1, c2, c3, c4);
129   PetscFunctionReturn(PETSC_SUCCESS);
130 }
131