464{
465 static double wholeCircle = 2*
M_PI;
466
467
468
469 bool ifWholeCircle = (fabs(dphi-wholeCircle) <
perMillion) ?
470 true : false;
471 double delPhi = ifWholeCircle ? wholeCircle : dphi;
472 int nSphi = (nstep > 0) ?
474 if (nSphi == 0) nSphi = 1;
475 int nVphi = ifWholeCircle ? nSphi : nSphi+1;
476 bool ifClosed = np1 > 0 ? false : true;
477
478
479
480 int absNp1 =
iabs(np1);
481 int absNp2 =
iabs(np2);
482 int i1beg = 0;
483 int i1end = absNp1-1;
484 int i2beg = absNp1;
485 int i2end = absNp1+absNp2-1;
487
488 for(i=i1beg;
i<=i2end;
i++) {
490 }
491
492 j = 0;
493 for (i=i1beg;
i<=i1end;
i++) {
494 j += (
r[
i] == 0.) ? 1 : nVphi;
495 }
496
497 bool ifSide1 = false;
498 bool ifSide2 = false;
499
500 if (
r[i2beg] !=
r[i1beg] ||
z[i2beg] !=
z[i1beg]) {
501 j += (
r[i2beg] == 0.) ? 1 : nVphi;
502 ifSide1 = true;
503 }
504
505 for(i=i2beg+1;
i<i2end;
i++) {
506 j += (
r[
i] == 0.) ? 1 : nVphi;
507 }
508
509 if (
r[i2end] !=
r[i1end] ||
z[i2end] !=
z[i1end]) {
510 if (absNp2 > 1) j += (
r[i2end] == 0.) ? 1 : nVphi;
511 ifSide2 = true;
512 }
513
514
515
516 k = ifClosed ? absNp1*nSphi : (absNp1-1)*nSphi;
517
518 if (absNp2 > 1) {
519 for(i=i2beg;
i<i2end;
i++) {
520 if (
r[i] > 0. ||
r[i+1] > 0.)
k += nSphi;
521 }
522
523 if (ifClosed) {
524 if (
r[i2end] > 0. ||
r[i2beg] > 0.)
k += nSphi;
525 }
526 }
527
528 if (!ifClosed) {
529 if (ifSide1 && (
r[i1beg] > 0. ||
r[i2beg] > 0.))
k += nSphi;
530 if (ifSide2 && (
r[i1end] > 0. ||
r[i2end] > 0.))
k += nSphi;
531 }
532
533 if (!ifWholeCircle) {
534 k += ifClosed ? 2*absNp1 : 2*(absNp1-1);
535 }
536
537
538
540
541
542
544 kk =
new int[absNp1+absNp2];
545
547 for(i=i1beg;
i<=i1end;
i++) {
549 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
550 }
551
553 if (ifSide1) {
555 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
556 }else{
558 }
559
560 for(i=i2beg+1;
i<i2end;
i++) {
562 if (
r[i] == 0.) {
m_pV[
k++] = HVPoint3D(0, 0,
z[i]); }
else {
k += nVphi; }
563 }
564
565 if (absNp2 > 1) {
567 if (ifSide2) {
569 if (
r[i] == 0.)
m_pV[
k] = HVPoint3D(0, 0,
z[i]);
570 }else{
572 }
573 }
574
575 double cosPhi, sinPhi;
576
577 for(j=0; j<nVphi; j++) {
578 cosPhi =
cos(
phi+j*delPhi/nSphi);
579 sinPhi =
sin(
phi+j*delPhi/nSphi);
580 for(i=i1beg;
i<=i2end;
i++) {
581 if (
r[i] != 0.)
m_pV[
kk[
i]+j] = HVPoint3D(
r[i]*cosPhi,
r[i]*sinPhi,
z[i]);
582 }
583 }
584
585
586
588
590 v2 = ifClosed ? nodeVis : 1;
591 for(i=i1beg;
i<i1end;
i++) {
593 if (!ifClosed && i == i1end-1) {
595 }else{
596 v2 = (
r[
i] ==
r[
i+1] &&
r[
i+1] ==
r[
i+2]) ? -1 : nodeVis;
597 }
599 edgeVis, ifWholeCircle, nSphi, k);
600 }
601 if (ifClosed) {
602 RotateEdge(kk[i1end], kk[i1beg],
r[i1end],
r[i1beg], nodeVis, nodeVis,
603 edgeVis, ifWholeCircle, nSphi, k);
604 }
605
606
607
608 if (absNp2 > 1) {
609 v2 = ifClosed ? nodeVis : 1;
610 for(i=i2beg;
i<i2end;
i++) {
612 if (!ifClosed && i==i2end-1) {
614 }else{
615 v2 = (
r[
i] ==
r[
i+1] &&
r[
i+1] ==
r[
i+2]) ? -1 : nodeVis;
616 }
618 edgeVis, ifWholeCircle, nSphi, k);
619 }
620 if (ifClosed) {
621 RotateEdge(kk[i2beg], kk[i2end],
r[i2beg],
r[i2end], nodeVis, nodeVis,
622 edgeVis, ifWholeCircle, nSphi, k);
623 }
624 }
625
626
627
628 if (!ifClosed) {
629 if (ifSide1) {
630 RotateEdge(kk[i2beg], kk[i1beg],
r[i2beg],
r[i1beg], 1, 1,
631 -1, ifWholeCircle, nSphi, k);
632 }
633 if (ifSide2) {
634 RotateEdge(kk[i1end], kk[i2end],
r[i1end],
r[i2end], 1, 1,
635 -1, ifWholeCircle, nSphi, k);
636 }
637 }
638
639
640
641 if (!ifWholeCircle) {
642
644
645 if (ifClosed) {
646 for (i=i1beg;
i<=i1end;
i++) {
648 ii[3] = (
i == i1end) ? i1beg :
i+1;
649 ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
650 ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
656 }
657 }else{
658 for (i=i1beg;
i<i1end;
i++) {
661 ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
662 ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
663 vv[0] = (
i == i1beg) ? 1 : -1;
665 vv[2] = (
i == i1end-1) ? 1 : -1;
668 }
669 }
670 }
671
673
675 std::cerr
676 << "Polyhedron::RotateAroundZ: number of generated faces ("
677 <<
k-1 <<
") is not equal to the number of allocated faces ("
679 << std::endl;
680 }
681}
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()