------------------------------------------------------------------------------
| 1162 | |
| 1163 | //------------------------------------------------------------------------------ |
| 1164 | void vtkCoordinateFrameRepresentation::SetNormal(double x, double y, double z) |
| 1165 | { |
| 1166 | double n[3] = { x, y, z }; |
| 1167 | vtkMath::Normalize(n); |
| 1168 | |
| 1169 | const double* xNormal = this->GetXVectorNormal(); |
| 1170 | const double* yNormal = this->GetYVectorNormal(); |
| 1171 | const double* zNormal = this->GetZVectorNormal(); |
| 1172 | double newXNormal[3], newYNormal[3], newZNormal[3]; |
| 1173 | |
| 1174 | // if none of the vectors is locked |
| 1175 | if (!this->XVectorIsLocked && !this->YVectorIsLocked && !this->ZVectorIsLocked) |
| 1176 | { |
| 1177 | // find the vector that is closest to the picked normal using the max dot product |
| 1178 | const double xDot = vtkMath::Dot(n, xNormal); |
| 1179 | const double yDot = vtkMath::Dot(n, yNormal); |
| 1180 | const double zDot = vtkMath::Dot(n, zNormal); |
| 1181 | const double maxDot = std::max({ xDot, yDot, zDot }); |
| 1182 | if (xDot == maxDot) |
| 1183 | { |
| 1184 | GramSchmidt(n, yNormal, zNormal, newXNormal, newYNormal, newZNormal); |
| 1185 | } |
| 1186 | else if (yDot == maxDot) |
| 1187 | { |
| 1188 | GramSchmidt(n, zNormal, xNormal, newYNormal, newZNormal, newXNormal); |
| 1189 | } |
| 1190 | else |
| 1191 | { |
| 1192 | GramSchmidt(n, xNormal, yNormal, newZNormal, newXNormal, newYNormal); |
| 1193 | } |
| 1194 | } |
| 1195 | // if one of the vectors is locked |
| 1196 | else |
| 1197 | { |
| 1198 | if (this->XVectorIsLocked) |
| 1199 | { |
| 1200 | GramSchmidt(n, yNormal, zNormal, newXNormal, newYNormal, newZNormal); |
| 1201 | } |
| 1202 | else if (this->YVectorIsLocked) |
| 1203 | { |
| 1204 | GramSchmidt(n, zNormal, xNormal, newYNormal, newZNormal, newXNormal); |
| 1205 | } |
| 1206 | else // ZVectorIsLocked |
| 1207 | { |
| 1208 | GramSchmidt(n, xNormal, yNormal, newZNormal, newXNormal, newYNormal); |
| 1209 | } |
| 1210 | } |
| 1211 | this->SetXVectorNormal(newXNormal); |
| 1212 | this->SetYVectorNormal(newYNormal); |
| 1213 | this->SetZVectorNormal(newZNormal); |
| 1214 | this->BuildRepresentation(); |
| 1215 | } |
| 1216 | |
| 1217 | //------------------------------------------------------------------------------ |
| 1218 | void vtkCoordinateFrameRepresentation::SetNormal(double n[3]) |
no test coverage detected