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 21 .seealso: PetscDrawPoint(), PetscDrawString(), PetscDrawSetMarkerType(), PetscDrawGetMarkerType() 22 23 @*/ 24 PetscErrorCode PetscDrawMarker(PetscDraw draw,PetscReal xl,PetscReal yl,int cl) 25 { 26 PetscErrorCode ierr; 27 28 PetscFunctionBegin; 29 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 30 if (draw->markertype == PETSC_DRAW_MARKER_CROSS){ 31 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 32 int i,j,k; 33 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 34 for (k=-2; k<=2; k++) { 35 ierr = (*draw->ops->pointpixel)(draw,i+k,j+k,cl);CHKERRQ(ierr); 36 ierr = (*draw->ops->pointpixel)(draw,i+k,j-k,cl);CHKERRQ(ierr); 37 } 38 } else if (draw->ops->string) { 39 ierr = (*draw->ops->string)(draw,xl,yl,cl,"x");CHKERRQ(ierr); 40 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CROSS"); 41 } else if (draw->markertype == PETSC_DRAW_MARKER_PLUS){ 42 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 43 int i,j,k; 44 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 45 for (k=-2; k<=2; k++) { 46 ierr = (*draw->ops->pointpixel)(draw,i,j+k,cl);CHKERRQ(ierr); 47 ierr = (*draw->ops->pointpixel)(draw,i+k,j,cl);CHKERRQ(ierr); 48 } 49 } else if (draw->ops->string) { 50 ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr); 51 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type PLUS"); 52 } else if (draw->markertype == PETSC_DRAW_MARKER_CIRCLE){ 53 if (draw->ops->coordinatetopixel && draw->ops->pointpixel) { 54 int i,j,k; 55 ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr); 56 for (k=-1; k<=1; k++) { 57 ierr = (*draw->ops->pointpixel)(draw,i+2,j+k,cl);CHKERRQ(ierr); 58 ierr = (*draw->ops->pointpixel)(draw,i-2,j+k,cl);CHKERRQ(ierr); 59 ierr = (*draw->ops->pointpixel)(draw,i+k,j+2,cl);CHKERRQ(ierr); 60 ierr = (*draw->ops->pointpixel)(draw,i+k,j-2,cl);CHKERRQ(ierr); 61 } 62 } else if (draw->ops->string) { 63 ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr); 64 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CIRCLE"); 65 } else { 66 ierr = (*draw->ops->point)(draw,xl,yl,cl);CHKERRQ(ierr); 67 } 68 PetscFunctionReturn(0); 69 } 70 71 /*@ 72 PetscDrawSetMarkerType - sets the type of marker to display with PetscDrawMarker() 73 74 Not collective 75 76 Input Parameters: 77 + draw - the drawing context 78 - mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT 79 80 Options Database: 81 . -draw_marker_type - x or point 82 83 Level: beginner 84 85 86 .seealso: PetscDrawPoint(), PetscDrawMarker(), PetscDrawGetMarkerType() 87 88 @*/ 89 PetscErrorCode PetscDrawSetMarkerType(PetscDraw draw,PetscDrawMarkerType mtype) 90 { 91 PetscFunctionBegin; 92 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 93 draw->markertype = mtype; 94 PetscFunctionReturn(0); 95 } 96 97 /*@ 98 PetscDrawGetMarkerType - gets the type of marker to display with PetscDrawMarker() 99 100 Not collective 101 102 Input Parameters: 103 + draw - the drawing context 104 - mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT 105 106 Level: beginner 107 108 109 .seealso: PetscDrawPoint(), PetscDrawMarker(), PetscDrawSetMarkerType() 110 111 @*/ 112 PetscErrorCode PetscDrawGetMarkerType(PetscDraw draw,PetscDrawMarkerType *mtype) 113 { 114 PetscFunctionBegin; 115 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 116 *mtype = draw->markertype; 117 PetscFunctionReturn(0); 118 } 119