1 2 /* 3 Provides the calling sequences for all the basic PetscDraw routines. 4 */ 5 #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6 const char *const PetscDrawMarkerTypes[] = {"CROSS","POINT","PLUS","CIRCLE","PetscDrawMarkerType","PETSC_DRAW_MARKER_",NULL}; 7 8 /*@ 9 PetscDrawMarker - PetscDraws a marker onto a drawable. 10 11 Not collective 12 13 Input Parameters: 14 + draw - the drawing context 15 . xl,yl - the coordinates of the marker 16 - cl - the color of the marker 17 18 Level: beginner 19 20 .seealso: PetscDrawPoint(), PetscDrawString(), PetscDrawSetMarkerType(), PetscDrawGetMarkerType() 21 22 @*/ 23 PetscErrorCode PetscDrawMarker(PetscDraw draw,PetscReal xl,PetscReal yl,int cl) 24 { 25 PetscErrorCode ierr; 26 27 PetscFunctionBegin; 28 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 29 if (draw->markertype == PETSC_DRAW_MARKER_CROSS) { 30 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 31 int i,j,k; 32 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 33 for (k=-2; k<=2; k++) { 34 ierr = (*draw->ops->pointpixel)(draw,i+k,j+k,cl);CHKERRQ(ierr); 35 ierr = (*draw->ops->pointpixel)(draw,i+k,j-k,cl);CHKERRQ(ierr); 36 } 37 } else if (draw->ops->string) { 38 ierr = (*draw->ops->string)(draw,xl,yl,cl,"x");CHKERRQ(ierr); 39 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CROSS"); 40 } else if (draw->markertype == PETSC_DRAW_MARKER_PLUS) { 41 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 42 int i,j,k; 43 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 44 for (k=-2; k<=2; k++) { 45 ierr = (*draw->ops->pointpixel)(draw,i,j+k,cl);CHKERRQ(ierr); 46 ierr = (*draw->ops->pointpixel)(draw,i+k,j,cl);CHKERRQ(ierr); 47 } 48 } else if (draw->ops->string) { 49 ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr); 50 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type PLUS"); 51 } else if (draw->markertype == PETSC_DRAW_MARKER_CIRCLE) { 52 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 53 int i,j,k; 54 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 55 for (k=-1; k<=1; k++) { 56 ierr = (*draw->ops->pointpixel)(draw,i+2,j+k,cl);CHKERRQ(ierr); 57 ierr = (*draw->ops->pointpixel)(draw,i-2,j+k,cl);CHKERRQ(ierr); 58 ierr = (*draw->ops->pointpixel)(draw,i+k,j+2,cl);CHKERRQ(ierr); 59 ierr = (*draw->ops->pointpixel)(draw,i+k,j-2,cl);CHKERRQ(ierr); 60 } 61 } else if (draw->ops->string) { 62 ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr); 63 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CIRCLE"); 64 } else { 65 ierr = (*draw->ops->point)(draw,xl,yl,cl);CHKERRQ(ierr); 66 } 67 PetscFunctionReturn(0); 68 } 69 70 /*@ 71 PetscDrawSetMarkerType - sets the type of marker to display with PetscDrawMarker() 72 73 Not collective 74 75 Input Parameters: 76 + draw - the drawing context 77 - mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT 78 79 Options Database: 80 . -draw_marker_type - x or point 81 82 Level: beginner 83 84 .seealso: PetscDrawPoint(), PetscDrawMarker(), PetscDrawGetMarkerType() 85 86 @*/ 87 PetscErrorCode PetscDrawSetMarkerType(PetscDraw draw,PetscDrawMarkerType mtype) 88 { 89 PetscFunctionBegin; 90 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 91 draw->markertype = mtype; 92 PetscFunctionReturn(0); 93 } 94 95 /*@ 96 PetscDrawGetMarkerType - gets the type of marker to display with PetscDrawMarker() 97 98 Not collective 99 100 Input Parameters: 101 + draw - the drawing context 102 - mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT 103 104 Level: beginner 105 106 .seealso: PetscDrawPoint(), PetscDrawMarker(), PetscDrawSetMarkerType() 107 108 @*/ 109 PetscErrorCode PetscDrawGetMarkerType(PetscDraw draw,PetscDrawMarkerType *mtype) 110 { 111 PetscFunctionBegin; 112 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 113 *mtype = draw->markertype; 114 PetscFunctionReturn(0); 115 } 116