HI,

the imput of my algortihme is

C1,C2,C3,C4,C5,C6,C7, Target

where the aim is :

-C7 will be in target Position

-C1 d'ont change it's position

- keep the distance and the local position between

C7-C6,C6-C5,C3-C2,C2-C1

C7-C6= mena the posiiton of the C7 relative to C6 (we must keep it and distance too)

SO the algorithm is like that

```
Real C1_Orig[3];
Ogre::Real C7_Temp[3];
Tolerance=1;
while (Tolerance > 1.0E-5) {
for (i0 = 0; i0 < 3; i0++) {
C7_Temp[i0] = C7[i0];
}
for (i0 = 0; i0 < 3; i0++) {
C1_Orig[i0] = C1[i0];
}
k++;
for (i0 = 0; i0 < 3; i0++) {
C7[i0] = Target[i0];
}
maintain_relative_position(C7, pos66,dv0);
for (i0 = 0; i0 < 3; i0++) {
C6[i0] = dv0[i0];
}
maintain_relative_position(C6, pos55,dv0);
for (i0 = 0; i0 < 3; i0++) {
C5[i0] = dv0[i0];
}
maintain_relative_position(C5, pos44,dv0);
for (i0 = 0; i0 < 3; i0++) {
C4[i0] = dv0[i0];
}
maintain_relative_position(C4, pos33,dv0);
for (i0 = 0; i0 < 3; i0++) {
C3[i0] = dv0[i0];
}
maintain_relative_position(C3, pos22,dv0);
for (i0 = 0; i0 < 3; i0++) {
C2[i0] = dv0[i0];
}
maintain_relative_position(C2, pos11,dv0);
for (i0 = 0; i0 < 3; i0++) {
C1[i0] = dv0[i0];
}
Tolerance = b_VectorMagnitude(C1, C1_Orig);
if (Tolerance > 0.0) {
/* cout<<"stage2222";
cout<<"\n";*/
for (i0 = 0; i0 < 3; i0++) {
C1[i0] = C1_Orig[i0];
}
maintain_relative_position(C1, pos2,dv0);
for (i0 = 0; i0 < 3; i0++) {
C2[i0] = dv0[i0];
}
maintain_relative_position(C2, pos3,dv0);
for (i0 = 0; i0 < 3; i0++) {
C3[i0] = dv0[i0];
}
maintain_relative_position(C3, pos4,dv0);
for (i0 = 0; i0 < 3; i0++) {
C4[i0] = dv0[i0];
}
maintain_relative_position(C4, pos5,dv0);
for (i0 = 0; i0 < 3; i0++) {
C5[i0] = dv0[i0];
}
maintain_relative_position(C5, pos6,dv0);
for (i0 = 0; i0 < 3; i0++) {
C6[i0] = dv0[i0];
}
maintain_relative_position(C6, pos7,dv0);
for (i0 = 0; i0 < 3; i0++) {
C7[i0] = dv0[i0];
}
Tolerance = b_VectorMagnitude(C7, Target);
if (abs(b_VectorMagnitude(C7_Temp, C7)) < 1.0E-5) {
Tolerance = 5.0E-6;
}
}
}
}
```

and

```
void maintain_relative_position(Real base_point[3], Real relative_position[3], Real new_point[3]) {
/* new_point is an output parameter whose value on return is the point that is relative_position away from base_point. */
int i;
for (i = 0; i < 3; i++) {
new_point[i] = base_point[i] + relative_position[i];
}
}
```

BUt in the output , it's true that the distance between points are kept and the posiiton of C7 will be in Traget position and the C1 did not change it's posiiton

BUT for the local position ,was changed

note: i used your function "maintain_relative_position"

"b_VectorMagnitude(C7, Target)" is to calculate the distance between Target and C7