|
124 | 124 | useflam_final = useflam;
|
125 | 125 | end
|
126 | 126 |
|
127 |
| -% use bernstein ellipses and rectangles to flag problematic points |
128 |
| -% |
129 | 127 |
|
130 | 128 | eps_local = 1e-3;
|
131 |
| - |
132 |
| -rho = 1.2; |
133 |
| -optsflag = []; optsflag.rho = rho; optsflag.occ = 5; |
134 |
| -if grid |
135 |
| - flag = flagnear_rectangle_grid(chnkr,x,y,optsflag); |
136 |
| -else |
137 |
| - flag = flagnear_rectangle(chnkr,pts,optsflag); |
138 |
| -end |
139 |
| - |
| 129 | +rho = 1.6; |
140 | 130 | npoly = chnkr.k;
|
141 | 131 | nlegnew = chnk.ellipse_oversample(rho,npoly,eps_local);
|
142 | 132 | nlegnew = max(nlegnew,chnkr.k);
|
143 | 133 |
|
144 | 134 | [chnkr2] = upsample(chnkr,nlegnew);
|
145 | 135 |
|
146 | 136 |
|
147 |
| - |
148 | 137 | icont = false;
|
149 | 138 | if usefmm_final
|
150 | 139 | try
|
|
185 | 174 | % for points where the integral might be inaccurate:
|
186 | 175 | % find close boundary point and check normal direction
|
187 | 176 |
|
| 177 | +iffy = min(abs(vals1+1),abs(vals1)) > 1e-2; |
| 178 | + |
| 179 | +ipt = find(iffy(:)); |
| 180 | +pts_iffy = pts(:,iffy); |
| 181 | + |
| 182 | +optsflag = []; optsflag.rho = rho; optsflag.occ = 5; |
| 183 | +flag = flagnear_rectangle(chnkr,pts_iffy,opts); |
| 184 | +flag2 = flagnear_rectangle(chnkr,chnkr.r(:,:),opts); |
| 185 | +flag2 = ((flag2.'*kron(speye(chnkr.nch),ones(chnkr.k,1))) > 1).'; |
188 | 186 |
|
189 |
| -nnzpt = sum(flag~=0,2); |
190 |
| -ipt = find(nnzpt); |
| 187 | +flag = (flag2*flag.').'; |
191 | 188 |
|
192 |
| -npts = numel(pts)/2; |
193 |
| -distmins = inf(npts,1); |
194 |
| -dss = zeros(2,npts); |
195 |
| -rss = zeros(2,npts); |
| 189 | +npts_iffy = numel(pts_iffy)/2; |
| 190 | +assert(npts_iffy == length(ipt)); |
| 191 | +distmins = inf(npts_iffy,1); |
| 192 | +dss = zeros(2,npts_iffy); |
| 193 | +rss = zeros(2,npts_iffy); |
196 | 194 |
|
197 | 195 | k = chnkr.k;
|
198 | 196 | [t,~,u] = lege.exps(k);
|
|
204 | 202 | dval = chnkr.d(:,:,i);
|
205 | 203 | nval = chnkr.n(:,:,i);
|
206 | 204 | [ji] = find(flag(:,i));
|
207 |
| - ptsi = pts(:,ji); |
| 205 | + |
| 206 | + ptsi = pts_iffy(:,ji); |
208 | 207 | nptsi = size(ptsi,2);
|
209 | 208 | dist2all = reshape(sum( abs(reshape(ptsi,2,1,nptsi) ...
|
210 | 209 | - reshape(rval,2,k,1)).^2, 1),k,nptsi);
|
|
223 | 222 | diffs = rval(:,ipti)-ptsi;
|
224 | 223 | dots = sum(ptsn.*diffs,1);
|
225 | 224 |
|
226 |
| - jsus = abs(dots) < 2e-1*sqrt(dist2all); |
| 225 | + jsus = abs(dots) < 0.9*sqrt(dist2all); |
227 | 226 | jii = ji(jsus);
|
228 |
| - [~,rs,ds,~,dist2s] = chnk.chunk_nearparam(rval,pts(:,jii),[],t,u); |
| 227 | + [~,rs,ds,~,dist2s] = chnk.chunk_nearparam(rval,pts_iffy(:,jii),[],t,u); |
229 | 228 | for j = 1:length(jii)
|
230 | 229 | jj = jii(j);
|
231 | 230 | if dist2s(j) < distmins(jj)
|
|
237 | 236 | end
|
238 | 237 |
|
239 | 238 | for i = 1:length(ipt)
|
240 |
| - jj = ipt(i); |
241 |
| - in(jj) = (rss(:,jj)-pts(:,jj)).'*[dss(2,jj);-dss(1,jj)] > 0; |
| 239 | + if distmins(i) < inf |
| 240 | + jj = ipt(i); |
| 241 | + in(jj) = (rss(:,i)-pts_iffy(:,i)).'*[dss(2,i);-dss(1,i)] > 0; |
| 242 | + end |
242 | 243 | end
|
0 commit comments