- function NearestPointOnSegment(Segment : TSegment) : TVertex;
- var
- S, E : TVertexD;
- u : Double;
- Y_new : Integer;
- begin
- Y_new := Viewport[3] - OGLFrame.YS;
- glGetDoublev(GL_MODELVIEW_MATRIX, @ModelMatrix);
- gluProject(Segment.S[0],Segment.S[1],Segment.S[2],ModelMatrix,ProjMatrix,Viewport,@S[0],@S[1],@S[2]);
- gluProject(Segment.E[0],Segment.E[1],Segment.E[2],ModelMatrix,ProjMatrix,Viewport,@E[0],@E[1],@E[2]);
- u:=((XS-S[0])*(E[0]-S[0])+(Y_new-S[1])*(E[1]-S[1]))/(sqr(E[0]-S[0])+sqr(E[1]-S[1]));
- if (u>0) and (u<1) then begin
- Result[0]:=Segment.S[0]+u*(Segment.E[0]-Segment.S[0]);
- Result[1]:=Segment.S[1]+u*(Segment.E[1]-Segment.S[1]);
- Result[2]:=Segment.S[2]+u*(Segment.E[2]-Segment.S[2]);
- end else begin
- Result[0]:=(Segment.S[0]+Segment.E[0])/2;
- Result[1]:=(Segment.S[1]+Segment.E[1])/2;
- Result[2]:=(Segment.S[2]+Segment.E[2])/2;
- end;
- end;