463{
464 static double wholeCircle = 2*
M_PI;
465
466
467
468 bool ifWholeCircle = (fabs(dphi-wholeCircle) <
perMillion) ?
469 true : false;
470 double delPhi = ifWholeCircle ? wholeCircle : dphi;
471 int nSphi = (nstep > 0) ?
473 if (nSphi == 0) nSphi = 1;
474 int nVphi = ifWholeCircle ? nSphi : nSphi+1;
475 bool ifClosed = np1 > 0 ? false : true;
476
477
478
479 int absNp1 =
iabs(np1);
480 int absNp2 =
iabs(np2);
481 int i1beg = 0;
482 int i1end = absNp1-1;
483 int i2beg = absNp1;
484 int i2end = absNp1+absNp2-1;
486
487 for(i=i1beg;
i<=i2end;
i++) {
489 }
490
491 j = 0;
492 for (i=i1beg;
i<=i1end;
i++) {
493 j += (
r[
i] == 0.) ? 1 : nVphi;
494 }
495
496 bool ifSide1 = false;
497 bool ifSide2 = false;
498
499 if (
r[i2beg] !=
r[i1beg] ||
z[i2beg] !=
z[i1beg]) {
500 j += (
r[i2beg] == 0.) ? 1 : nVphi;
501 ifSide1 = true;
502 }
503
504 for(i=i2beg+1;
i<i2end;
i++) {
505 j += (
r[
i] == 0.) ? 1 : nVphi;
506 }
507
508 if (
r[i2end] !=
r[i1end] ||
z[i2end] !=
z[i1end]) {
509 if (absNp2 > 1) j += (
r[i2end] == 0.) ? 1 : nVphi;
510 ifSide2 = true;
511 }
512
513
514
515 k = ifClosed ? absNp1*nSphi : (absNp1-1)*nSphi;
516
517 if (absNp2 > 1) {
518 for(i=i2beg;
i<i2end;
i++) {
519 if (
r[i] > 0. ||
r[i+1] > 0.)
k += nSphi;
520 }
521
522 if (ifClosed) {
523 if (
r[i2end] > 0. ||
r[i2beg] > 0.)
k += nSphi;
524 }
525 }
526
527 if (!ifClosed) {
528 if (ifSide1 && (
r[i1beg] > 0. ||
r[i2beg] > 0.))
k += nSphi;
529 if (ifSide2 && (
r[i1end] > 0. ||
r[i2end] > 0.))
k += nSphi;
530 }
531
532 if (!ifWholeCircle) {
533 k += ifClosed ? 2*absNp1 : 2*(absNp1-1);
534 }
535
536
537
539
540
541
543 kk =
new int[absNp1+absNp2];
544
546 for(i=i1beg;
i<=i1end;
i++) {
548 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
549 }
550
552 if (ifSide1) {
554 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
555 }else{
557 }
558
559 for(i=i2beg+1;
i<i2end;
i++) {
561 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
562 }
563
564 if (absNp2 > 1) {
566 if (ifSide2) {
568 if (
r[i] == 0.)
m_pV[
k] = HVPoint3D(0, 0,
z[i]);
569 }else{
571 }
572 }
573
574 double cosPhi, sinPhi;
575
576 for(j=0; j<nVphi; j++) {
577 cosPhi =
cos(
phi+j*delPhi/nSphi);
578 sinPhi =
sin(
phi+j*delPhi/nSphi);
579 for(i=i1beg;
i<=i2end;
i++) {
580 if (
r[i] != 0.)
m_pV[
kk[
i]+j] = HVPoint3D(
r[i]*cosPhi,
r[i]*sinPhi,
z[i]);
581 }
582 }
583
584
585
587
589 v2 = ifClosed ? nodeVis : 1;
590 for(i=i1beg;
i<i1end;
i++) {
592 if (!ifClosed && i == i1end-1) {
594 }else{
595 v2 = (
r[
i] ==
r[
i+1] &&
r[
i+1] ==
r[
i+2]) ? -1 : nodeVis;
596 }
598 edgeVis, ifWholeCircle, nSphi, k);
599 }
600 if (ifClosed) {
601 RotateEdge(kk[i1end], kk[i1beg],
r[i1end],
r[i1beg], nodeVis, nodeVis,
602 edgeVis, ifWholeCircle, nSphi, k);
603 }
604
605
606
607 if (absNp2 > 1) {
608 v2 = ifClosed ? nodeVis : 1;
609 for(i=i2beg;
i<i2end;
i++) {
611 if (!ifClosed && i==i2end-1) {
613 }else{
614 v2 = (
r[
i] ==
r[
i+1] &&
r[
i+1] ==
r[
i+2]) ? -1 : nodeVis;
615 }
617 edgeVis, ifWholeCircle, nSphi, k);
618 }
619 if (ifClosed) {
620 RotateEdge(kk[i2beg], kk[i2end],
r[i2beg],
r[i2end], nodeVis, nodeVis,
621 edgeVis, ifWholeCircle, nSphi, k);
622 }
623 }
624
625
626
627 if (!ifClosed) {
628 if (ifSide1) {
629 RotateEdge(kk[i2beg], kk[i1beg],
r[i2beg],
r[i1beg], 1, 1,
630 -1, ifWholeCircle, nSphi, k);
631 }
632 if (ifSide2) {
633 RotateEdge(kk[i1end], kk[i2end],
r[i1end],
r[i2end], 1, 1,
634 -1, ifWholeCircle, nSphi, k);
635 }
636 }
637
638
639
640 if (!ifWholeCircle) {
641
643
644 if (ifClosed) {
645 for (i=i1beg;
i<=i1end;
i++) {
647 ii[3] = (
i == i1end) ? i1beg :
i+1;
648 ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
649 ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
655 }
656 }else{
657 for (i=i1beg;
i<i1end;
i++) {
660 ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
661 ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
662 vv[0] = (
i == i1beg) ? 1 : -1;
664 vv[2] = (
i == i1end-1) ? 1 : -1;
667 }
668 }
669 }
670
672
674 std::cerr
675 << "Polyhedron::RotateAroundZ: number of generated faces ("
676 <<
k-1 <<
") is not equal to the number of allocated faces ("
678 << std::endl;
679 }
680}
Scalar phi() const
phi method
void SetSideFacets(int ii[4], int vv[4], int *kk, double *r, double dphi, int ns, int &kface)
void RotateEdge(int k1, int k2, double r1, double r2, int v1, int v2, int vEdge, bool ifWholeCircle, int ns, int &kface)
static int GetNumberOfRotationSteps()