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

📄 doedges.m

📁 任意边界结构正交曲线网格生成程序
💻 M
字号:
function theResult = doedges(self)% doedges -- Draw the edges.%  doedges(self) draws the interactive boundary%   associated with self, a "seagrid" object. % 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 17:03:02.% Updated    21-Sep-2000 15:02:41.% N.B. -- We eliminate screen flashing by applying the%  'xor' EraseMode to each drawing motion and using%  "plot", rather than "line".% N.B. -- This routine can be made more efficient by%  rearranging, rather than eliminating, handles.if nargout > 0, theResult = self; end% Initialize.thePoints = psget(self, 'itsPoints');if length(thePoints)  < 4, return, endx = zeros(size(thePoints));y = zeros(size(thePoints));theTags = cell(size(thePoints));theEdges = zeros(size(thePoints));   % Edge handles.theCorners = [];   % Corner indices.theEraseMode = psget(self, 'itsEraseMode');theCornerTag = psget(self, 'itsCornerTag');theEdgePointTag = psget(self, 'itsEdgePointTag');% Get the xy data and corner-point indices.if min(size(thePoints)) == 1	for k = 1:length(thePoints)		x(k) = get(thePoints(k), 'XData');		y(k) = get(thePoints(k), 'YData');		theTags{k} = get(thePoints(k), 'Tag');		if isequal(theTags{k}, theCornerTag)			theCorners = [theCorners k];   % #1 is always a theCorners-point.		end	endelse	x = thePoints(:, 1); x = x(:).';	y = thePoints(:, 2); y = y(:).';	t = thePoints(:, 3); t = t(:).';	theCorners = find(t);	theTags = cell(size(t));	for k = 1:length(t)		switch t(k)		case 0			theTags{k} = theEdgePointTag;		otherwise			theTags{k} = theCornerTag;		end	end	theEdges = zeros(size(x));   % Edge handles.end% Compute splines.%  Our independent variable is the "index" number, but%  that leads to seemingly, odd behavior when adding%  a point.  A better variable would be distance along%  the edge or curve.  We wonder whether there is a%  "root" spline, similar to the "root" that attends%  iterative median-filtering.   Must investigate.xtemp = x;xtemp(end+1) = xtemp(1);ytemp = y;ytemp(end+1) = ytemp(1);ztemp = xtemp + sqrt(-1) * ytemp;ctemp = theCorners;ctemp(end+1) = length(xtemp);theEndSlopeFlag = psget(self, 'itsEndSlopeFlag');for i = 1:4	ct = ctemp(i):ctemp(i+1);	zt = ztemp(ctemp(i):ctemp(i+1));	if theEndSlopeFlag		s = diff(zt) ./ diff(ct);		zt = [s(1) zt s(end)];   % End-slopes; see "help spline".	end	pp{i} = spline(ct, zt);end% Delete old edges.oldEdges = findobj('Type', 'line', 'Tag', 'edge');delete(oldEdges)% Draw new edges.ppindex = 0;for k = 1:length(xtemp)-1	if any(k == ctemp)		ppindex = ppindex+1;	end	xx = linspace(k, k+1, 11);	zz = ppval(pp{ppindex}, xx);	hold on	theEdges(k) = plot(real(zz), imag(zz), 'r-', 'EraseMode', theEraseMode);	hold offendtheTag = psget(self, 'itsEdgeTag');theLineStyle = psget(self, 'itsEdgeLineStyle');theLineWidth = get(0, 'DefaultLineLineWidth');theLineWidth = 2.5;theButtonDownFcn = 'psevent down';thePointFlag = psget(self, 'itsPointFlag');if ~thePointFlag, theButtonDownFcn = ''; endset(theEdges, 'Tag', theTag, 'LineStyle', theLineStyle, ...				'LineWidth', theLineWidth, ...				'ButtonDownFcn', theButtonDownFcn)psset(self, 'itsEdges', theEdges)% Stash a NaN place-holder into each edge, that will%  indicate the position of the new point, should%  that edge be clicked upon.for k = 1:length(thePoints)	p = zeros(1, length(thePoints)+1);	p(k+1) = NaN;	set(theEdges(k), 'UserData', p)endif nargout > 0, theResult = self; end

⌨️ 快捷键说明

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