xref: /petsc/src/sys/classes/draw/interface/drect.c (revision cc4c1da905d89950b196b027190941013bd3e15a)
1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith /*@C
4811af0c4SBarry Smith   PetscDrawIndicatorFunction - Draws an indicator function (where a relationship is true) on a `PetscDraw`
55c6c1daeSBarry Smith 
620f4b53cSBarry Smith   Not Collective
75c6c1daeSBarry Smith 
8d8d19677SJose E. Roman   Input Parameters:
9811af0c4SBarry Smith + draw      - a `PetscDraw`
102fe279fdSBarry Smith . xmin      - region to draw indicator function
112fe279fdSBarry Smith . xmax      - region to draw indicator function
122fe279fdSBarry Smith . ymin      - region to draw indicator function
132fe279fdSBarry Smith . ymax      - region to draw indicator function
1410450e9eSJacob Faibussowitsch . c         - the color of the region
1510450e9eSJacob Faibussowitsch . indicator - the indicator function
1610450e9eSJacob Faibussowitsch - ctx       - the context to pass to the indicator function
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith   Level: developer
195c6c1daeSBarry Smith 
20811af0c4SBarry Smith .seealso: `PetscDraw`
215c6c1daeSBarry Smith @*/
22d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawIndicatorFunction(PetscDraw draw, PetscReal xmin, PetscReal xmax, PetscReal ymin, PetscReal ymax, int c, PetscErrorCode (*indicator)(void *, PetscReal, PetscReal, PetscBool *), void *ctx)
23d71ae5a4SJacob Faibussowitsch {
24a7e8706aSLisandro Dalcin   int       i, j, xstart, ystart, xend, yend;
255c6c1daeSBarry Smith   PetscReal x, y;
265c6c1daeSBarry Smith   PetscBool isnull, flg;
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith   PetscFunctionBegin;
295c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
309566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
313ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
325c6c1daeSBarry Smith 
339566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw, xmin, ymin, &xstart, &ystart));
349566063dSJacob Faibussowitsch   PetscCall(PetscDrawCoordinateToPixel(draw, xmax, ymax, &xend, &yend));
359371c9d4SSatish Balay   if (yend < ystart) {
369371c9d4SSatish Balay     PetscInt tmp = ystart;
379371c9d4SSatish Balay     ystart       = yend;
389371c9d4SSatish Balay     yend         = tmp;
399371c9d4SSatish Balay   }
4045f3bb6eSLisandro Dalcin 
4145f3bb6eSLisandro Dalcin   for (i = xstart; i <= xend; i++) {
4245f3bb6eSLisandro Dalcin     for (j = ystart; j <= yend; j++) {
439566063dSJacob Faibussowitsch       PetscCall(PetscDrawPixelToCoordinate(draw, i, j, &x, &y));
449566063dSJacob Faibussowitsch       PetscCall(indicator(ctx, x, y, &flg));
451baa6e33SBarry Smith       if (flg) PetscCall(PetscDrawPointPixel(draw, i, j, c));
465c6c1daeSBarry Smith     }
475c6c1daeSBarry Smith   }
483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
495c6c1daeSBarry Smith }
505c6c1daeSBarry Smith 
51*cc4c1da9SBarry Smith /*@
52811af0c4SBarry Smith   PetscDrawCoordinateToPixel - given a coordinate in a `PetscDraw` returns the pixel location
535c6c1daeSBarry Smith 
5420f4b53cSBarry Smith   Not Collective
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith   Input Parameters:
575c6c1daeSBarry Smith + draw - the draw where the coordinates are defined
586b867d5aSJose E. Roman . x    - the horizontal coordinate
596b867d5aSJose E. Roman - y    - the vertical coordinate
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   Output Parameters:
626b867d5aSJose E. Roman + i - the horizontal pixel location
636b867d5aSJose E. Roman - j - the vertical pixel location
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith   Level: developer
665c6c1daeSBarry Smith 
67811af0c4SBarry Smith .seealso: `PetscDraw`
685c6c1daeSBarry Smith @*/
69d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCoordinateToPixel(PetscDraw draw, PetscReal x, PetscReal y, int *i, int *j)
70d71ae5a4SJacob Faibussowitsch {
715c6c1daeSBarry Smith   PetscFunctionBegin;
725c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
73dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, coordinatetopixel, x, y, i, j);
743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
77*cc4c1da9SBarry Smith /*@
78811af0c4SBarry Smith   PetscDrawPixelToCoordinate - given a pixel in a `PetscDraw` returns the coordinate
795c6c1daeSBarry Smith 
8020f4b53cSBarry Smith   Not Collective
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith   Input Parameters:
835c6c1daeSBarry Smith + draw - the draw where the coordinates are defined
846b867d5aSJose E. Roman . i    - the horizontal pixel location
856b867d5aSJose E. Roman - j    - the vertical pixel location
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith   Output Parameters:
886b867d5aSJose E. Roman + x - the horizontal coordinate
896b867d5aSJose E. Roman - y - the vertical coordinate
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith   Level: developer
925c6c1daeSBarry Smith 
93811af0c4SBarry Smith .seealso: `PetscDraw`
945c6c1daeSBarry Smith @*/
95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawPixelToCoordinate(PetscDraw draw, int i, int j, PetscReal *x, PetscReal *y)
96d71ae5a4SJacob Faibussowitsch {
975c6c1daeSBarry Smith   PetscFunctionBegin;
985c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
99dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, pixeltocoordinate, i, j, x, y);
1003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1015c6c1daeSBarry Smith }
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith /*@
1042fe279fdSBarry Smith   PetscDrawRectangle - draws a rectangle onto a `PetscDraw` object
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith   Not Collective
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   Input Parameters:
1095c6c1daeSBarry Smith + draw - the drawing context
1102fe279fdSBarry Smith . xl   - coordinates of the lower left corner
1112fe279fdSBarry Smith . yl   - coordinates of the lower left corner
1122fe279fdSBarry Smith . xr   - coordinate of the upper right corner
1132fe279fdSBarry Smith . yr   - coordinate of the upper right corner
1142fe279fdSBarry Smith . c1   - the color of the first corner
1152fe279fdSBarry Smith . c2   - the color of the second corner
1162fe279fdSBarry Smith . c3   - the color of the third corner
1172fe279fdSBarry Smith - c4   - the color of the fourth corner
1185c6c1daeSBarry Smith 
1195c6c1daeSBarry Smith   Level: beginner
1205c6c1daeSBarry Smith 
12142747ad1SJacob Faibussowitsch .seealso: `PetscDraw`, `PetscDrawLine()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`,
122aec76313SJacob Faibussowitsch           `PetscDrawMarker()`, `PetscDrawPoint()`, `PetscDrawString()`, `PetscDrawArrow()`
1235c6c1daeSBarry Smith @*/
124d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRectangle(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr, int c1, int c2, int c3, int c4)
125d71ae5a4SJacob Faibussowitsch {
1265c6c1daeSBarry Smith   PetscFunctionBegin;
1275c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
128dbbe0bcdSBarry Smith   PetscUseTypeMethod(draw, rectangle, xl, yl, xr, yr, c1, c2, c3, c4);
1293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1305c6c1daeSBarry Smith }
131