MCPcopy Create free account
hub / github.com/Kitware/VTK / Scale

Method Scale

Interaction/Widgets/vtkBrokenLineWidget.cxx:869–926  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

867}
868
869void vtkBrokenLineWidget::Scale(double* p1, double* p2, int vtkNotUsed(X), int Y)
870{
871 // Get the motion vector
872 double v[3];
873 v[0] = p2[0] - p1[0];
874 v[1] = p2[1] - p1[1];
875 v[2] = p2[2] - p1[2];
876
877 double center[3] = { 0., 0., 0. };
878 double avgdist = 0.;
879 double* prevctr = this->HandleGeometry[0]->GetCenter();
880 double* ctr;
881
882 center[0] += prevctr[0];
883 center[1] += prevctr[1];
884 center[2] += prevctr[2];
885
886 int i;
887 for (i = 1; i < this->NumberOfHandles; ++i)
888 {
889 ctr = this->HandleGeometry[i]->GetCenter();
890 center[0] += ctr[0];
891 center[1] += ctr[1];
892 center[2] += ctr[2];
893 avgdist += sqrt(vtkMath::Distance2BetweenPoints(ctr, prevctr));
894 prevctr = ctr;
895 }
896
897 avgdist /= this->NumberOfHandles;
898
899 center[0] /= this->NumberOfHandles;
900 center[1] /= this->NumberOfHandles;
901 center[2] /= this->NumberOfHandles;
902
903 // Compute the scale factor
904 double sf = vtkMath::Norm(v) / avgdist;
905 if (Y > this->Interactor->GetLastEventPosition()[1])
906 {
907 sf = 1.0 + sf;
908 }
909 else
910 {
911 sf = 1.0 - sf;
912 }
913
914 // Move the handle points
915 double newCtr[3];
916 for (i = 0; i < this->NumberOfHandles; ++i)
917 {
918 ctr = this->HandleGeometry[i]->GetCenter();
919 for (int j = 0; j < 3; ++j)
920 {
921 newCtr[j] = sf * (ctr[j] - center[j]) + center[j];
922 }
923 this->HandleGeometry[i]->SetCenter(newCtr);
924 this->HandleGeometry[i]->Update();
925 }
926}

Callers 1

OnMouseMoveMethod · 0.95

Calls 5

sqrtFunction · 0.50
NormFunction · 0.50
GetCenterMethod · 0.45
SetCenterMethod · 0.45
UpdateMethod · 0.45

Tested by

no test coverage detected