| 867 | } |
| 868 | |
| 869 | void 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 | } |