| 626 | } |
| 627 | |
| 628 | KN< long > *CloseTo3(Stack stack, double const &eps, KNM_< double > const &P, |
| 629 | KNM_< double > const &Q) { |
| 630 | long Pm0 = P.M( ); |
| 631 | long Qm0 = Q.M( ); |
| 632 | long Pn0 = P.N( ); |
| 633 | long Qn0 = Q.N( ); |
| 634 | ffassert(Pn0>=3 && Qn0>=3); |
| 635 | int po00 = 0; |
| 636 | int po10 = P.step * P.shapei.step; |
| 637 | int po20 = P.step * P.shapei.step*2; |
| 638 | int offset[3]={po00,po10,po20}; |
| 639 | double x0 = P(0, ':').min( ); |
| 640 | double y0 = P(1, ':').min( ); |
| 641 | double z0 = P(2, ':').min( ); |
| 642 | double x1 = P(0, ':').max( ); |
| 643 | double y1 = P(1, ':').max( ); |
| 644 | double z1 = P(2, ':').max( ); |
| 645 | |
| 646 | // add cc |
| 647 | double dd = max(max(x1 - x0, y1 - y0),z1-z0) * 0.01; |
| 648 | |
| 649 | if (dd == 0) { |
| 650 | dd = max(max(abs(x0), abs(y0)), abs(z0))* 1e-8; |
| 651 | } |
| 652 | |
| 653 | if (dd == 0) { |
| 654 | dd = 1e-8; |
| 655 | } |
| 656 | |
| 657 | double data[] = {x0 - dd, y0 - dd,z0 - dd, x1 + dd, y1 + dd,z1 + dd}; |
| 658 | R3close S(data, Pm0, eps, offset); |
| 659 | |
| 660 | for (int i = 0; i < Pm0; ++i) { |
| 661 | if (verbosity > 19) { |
| 662 | cout << i << " :: " << P(0, i) << " " << P(1, i) << " " << P(2, i) << endl; |
| 663 | } |
| 664 | |
| 665 | S.AddSimple(&P(0, i)); |
| 666 | } |
| 667 | |
| 668 | KN< long > *pr = new KN< long >(Qm0); |
| 669 | |
| 670 | for (int i = 0; i < Qm0; ++i) { |
| 671 | R2close::Point *p = S.Find(Q(0, i), Q(1, i), Q(2, i)); |
| 672 | if (p) { |
| 673 | (*pr)[i] = p - S.P; |
| 674 | } else { |
| 675 | (*pr)[i] = -1; |
| 676 | } |
| 677 | } |
| 678 | |
| 679 | return Add2StackOfPtr2FreeRC(stack, pr); |
| 680 | } |
| 681 | |
| 682 | KN< long > *CloseTo2t(Stack stack, double const &eps, KNM_< double > const &P, |
| 683 | KNM_< double > const &Q) { |