⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getboundary.m

📁 一些制作正交曲线网格的matlab源程序
💻 M
字号:
function theResult = getboundary(self, theCommand, theMessage)% seagrid/getboundary -- Boundary construction.%  getboundary(self, theCommand, theMessage) processes theCommand%   and theMessage on behalf of self, a "seagrid" object.%%  [> CORNERS <] -- Start by clicking on four locations in%     counter-clockwise sequence to initialize the four%     corner-points of the boundary.%%  [> EDGES <] -- Use "mousedown-and-drag" on any edge to insert%     and drag a new control-point.%%  [> DRAG <] -- Use "mousedown-and-drag" on a control point or%     spacer-point to move it.%%  [> DELETE <] -- Use "alt-click" on a control-point to delete it.%%  [> ZOOM <] -- Click in white-space to invoke "zoomsafe" action.%     See "help zoomsafe". % Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.%  All Rights Reserved.%   Disclosure without explicit written consent from the%    copyright owner does not constitute publication. % Version of 09-Apr-1999 09:19:32.% Updated    23-Apr-2001 16:24:11.persistent theDraggablepersistent didMoveif nargin < 1, help(mfilename), return, endif nargin < 2, theCommand = 'start'; endif nargin < 3, theMessage = ''; end% Initialization.switch lower(theCommand)case 'start'	h = get(gca, 'Children');	if isempty(h)		set(gca, 'XLim', [-0.5 0.5], 'YLim', [-0.5 0.5])	else		axis tight	end	doticks(self)	theButtonDownFcn = 'psevent corner';	set(gcf, 'WindowButtonDownFcn', theButtonDownFcn)	if ismac		set(gcf, 'Pointer', 'crosshair')	else		set(gcf, 'Pointer', 'cross')	end%	help_start(self)	returncase 'clear'	set(gca, 'ButtonDownFcn', '', 'UserData', [])	returnend% Mouse activities.% disp([' ## ' command ' ' num2str(gcbo)])curr = get(gca, 'CurrentPoint');x = curr(1, 1); y = curr(1, 2);% disp([' ## ' num2str(x) ' ' num2str(y)])sel = get(gcf, 'SelectionType');theLineStyle = psget(self, 'itsCornerLineStyle');theMarker = psget(self, 'itsCornerMarker');theColor = psget(self, 'itsCornerColor');theEraseMode = psget(self, 'itsEraseMode');% Get four corner-points.switch lower(theCommand)case 'corner'	thePoints = get(gca, 'UserData');	if length(thePoints) < 4		theTag = 'corner-point';		hold on		h = plot(x, y, 'EraseMode', theEraseMode, 'Tag', theTag);		hold off		thePoints = [thePoints h];		switch length(thePoints)		case 1			theMarker = '*';		otherwise			theMarker = 'o';		end		set(h, 'LineStyle', theLineStyle, 'Marker', theMarker, ...				'Color', theColor, 'EraseMode', theEraseMode)		set(gca, 'UserData', thePoints)	end	if length(thePoints) >= 4		set(gcf, 'Pointer', 'arrow')		thePoints = get(gca, 'UserData');		thePoints = rearrange(thePoints(1:4));		set(gca, 'ButtonDownFcn', '', 'UserData', [])		set(gcf, 'WindowButtonDownFcn', '')		h = findobj('Type', 'line', 'Tag', 'coastline');		if any(h), set(h, 'ButtonDownFcn', ''), end		h = findobj('Type', 'line', 'Tag', 'bathymetry');		if any(h), set(h, 'ButtonDownFcn', ''), end		psset(self, 'itsPoints', thePoints)		psset(self, 'itsMaskToolFlag', 0)   % Note.		doupdate(self, 1)	end	returnotherwiseend% Manipulate points.switch lower(theCommand)case 'motion'	didMove = 1;	switch get(theDraggable, 'Tag')	case {'corner-point', 'edge-point', 'pot'}		set(theDraggable, 'XData', x, 'YData', y)	case 'spacer'		switch sel		case 'alt'			set(theDraggable, 'XData', x, 'YData', y)		otherwise			set(theDraggable, 'XData', x, 'YData', y)		end	otherwise	endcase 'up'	set(gcf, 'WindowButtonMotionFcn', '', 'WindowButtonUpFcn', '')	set(gcf, 'Pointer', 'arrow')	switch get(theDraggable, 'Tag')	case {'corner-point', 'edge-point', 'pot'}		set(theDraggable, 'XData', x, 'YData', y)		theDraggable = [];				psset(self, 'itsMaskToolFlag', 0)				doupdate(self, 1)	case 'spacer'		set(theDraggable, 'XData', x, 'YData', y)		theDraggable = [];		sel = get(gcf, 'SelectionType');		switch sel		case 'normal'			psset(self, 'itsMaskToolFlag', 0)   % Note.			doupdate(self, ~ismac)		case 'extend'			dospacings(self)			dospacers(self)		case 'alt'		end	otherwise	end	didMove = 0;case 'down'	didMove = 0;	switch get(gco, 'Tag')	case 'corner-point'   % Drag a corner-point.		switch sel		case 'normal'   % Drag it.			theDraggable = gco;			getboundary(self, 'dodrag')		otherwise			disp([' ## "' sel '-click" not used by corners.'])		end	case 'edge'   % Add/drag a new edge-point.		switch sel		case 'normal'   % Add/drag it.			theEraseMode = psget(self, 'itsEraseMode');			hold on			h = plot(x, y, 'EraseMode', theEraseMode, 'Tag', 'edge-point');			hold off			theDraggable = h;			thePoints = psget(self, 'itsPoints');			p = get(gco, 'UserData');			p(~isnan(p)) = thePoints;			p(isnan(p)) = h;			thePoints = p;			theButtonDownFcn = 'psevent down';			theLineStyle = 'none';			theMarker = psget(self, 'itsEdgeMarker');			theColor = psget(self, 'itsEdgeColor');			set(h, 'UserData', thePoints, 'ButtonDownFcn', theButtonDownFcn)			set(h, 'EraseMode', theEraseMode, 'LineStyle', 'none', ...					'Marker', theMarker, 'Color', theColor)			psset(self, 'itsPoints', thePoints)			getboundary(self, 'dodrag')		otherwise			disp([' ## "' sel '-click" not used by edges.'])		end	case 'edge-point'   % Drag or delete edge-point.		switch sel		case 'normal'   % Drag it.			theDraggable = gco;			didMove = 0;			getboundary(self, 'dodrag')		case 'extend'   % Toggle -- not used.			theSelected = get(gco, 'Selected');			switch theSelected			case 'on'				theSelected = 'off';			case 'off'				theSelected = 'on';			otherwise			end			set(gco, 'Selected', theSelected)		case 'alt'   % Delete it.			thePoints = get(gco, 'UserData');			thePoints(thePoints == gco) = [];			delete(gco)			set(thePoints, 'UserData', thePoints)			psset(self, 'itsPoints', thePoints)			psset(self, 'itsMaskToolFlag', 0)   % Note.			doupdate(self, 1)		otherwise		end		% N.B. We will double or (halve) the local grid density on%  either side of a spacer by using click (or shift-slick).%  Option-click can be used to reposition a single grid-line.	case 'spacer'		switch sel		case 'normal'   % Select it.			h = findobj('Tag', 'pot', 'Selected', 'on');			set(h, 'Selected', 'off')			theDraggable = gco;			set(theDraggable, 'Selected', 'on')			didMove = 0;			getboundary(self, 'dodrag')		case 'extend'   % Select it.			h = findobj('Tag', 'pot', 'Selected', 'on');			set(h, 'Selected', 'off')			theDraggable = gco;			set(theDraggable, 'Selected', 'on')			didMove = 0;			getboundary(self, 'dodrag')		case 'alt'   % Drag it.			h = findobj('Tag', 'pot', 'Selected', 'on');			set(h, 'Selected', 'off')			theDraggable = gco;			set(theDraggable, 'Selected', 'on')			didMove = 0;			getboundary(self, 'dodrag')		otherwise			disp([' ## "' sel '-click" not used by spacers.'])		end	case 'pot'	otherwise	endcase 'dodrag'   % Drag one point.	thePointer = 'circle';	theSelected = 'on';	theWindowButtonMotionFcn = 'psevent motion';	theWindowButtonUpFcn = 'psevent up';	set(gcf, 'WindowButtonMotionFcn', theWindowButtonMotionFcn, ...				'WindowButtonUpFcn', theWindowButtonUpFcn, ...				'Pointer', thePointer)otherwiseendfunction theResult = rearrange(thePoints)% rearrange -- Rearrange points to counter-clockwise.%  rearrange(thePoints) flips the order of thePoints%   (handles) if they are not in counter-clockwise%   sequence. % Copyright (C) 1999 Dr. Charles R. Denham, ZYDECO.%  All Rights Reserved.%   Disclosure without explicit written consent from the%    copyright owner does not constitute publication. % Version of 16-Apr-1999 11:19:36.if nargin < 1, help(mfilename), return, endx = zeros(length(thePoints), 1);y = zeros(size(x));for i = 1:length(thePoints)	x(i) = get(thePoints(i), 'XData');	y(i) = get(thePoints(i), 'YData');endx(end+1) = x(1);y(end+1) = y(1);i = 1:length(x)-1;j = i+1;theArea = 0.5 * sum(x(i).*y(j) - x(j).*y(i));result = thePoints;if theArea < 0	result(2:length(result)) = result(length(result):-1:2);endtheResult = result;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -