∫((1-z)/(1+(z^2)))\[DifferentialD]z

boat[x_,y_,x0_,y0_]:=({{\[Piecewise], ({{None, x==0||x0==0}, {-ArcTan[(y/x)]+Log[(Sqrt[(x^2)+(y^2)])]+ArcTan[(y0/x0)]-Log[(Sqrt[(x0^2)+(y0^2)])], True}})}});
boatStartPoint={0.10923022856821986`,-0.21846045713643972`};
lighthouse[x_,x0_,y0_]:=((x*y0)/x0);
lighthouseImplicit[x_,y_,x0_,y0_]:=-y*x0+x*y0;
checkpoint={1,2};

(* Function to find the intersection points between the line and the curve (http://mathematica.stackexchange.com/questions/275/updating-wagons-findallcrossings2d-function) *)
FindRoots2D::usage="FindRoots2D[funcs,{x,a,b},{y,c,d}] finds all nontangential solutions to
   {f=0, g=0} in the given rectangle.";

Options[FindRoots2D]={PlotPoints->Automatic,MaxRecursion->Automatic};

FindRoots2D[funcs:{f1_,f2_},{x_,a_,b_},{y_,c_,d_},opts:OptionsPattern[]]:=Module[{fZero,seeds,fy=Compile[{x,y},f2]},fZero=Cases[Normal@ContourPlot[f1==0,{x,a-(b-a)/97,b+(b-a)/103},{y,c-(d-c)/98,d+(d-c)/102},Evaluate@FilterRules[{opts},Options@ContourPlot]],Line[z_]:>z,Infinity];
seeds=Pick[Rest@#,Rest[#]Most[#]&@Sign@Apply[fy,#,2],-1]&/@fZero;
With[{seq=FilterRules[{opts},Options@FindRoot]},Select[Union[{x,y}/.FindRoot[funcs,{x,#},{y,#2},seq]&@@@Join@@seeds,SameTest->(Norm[#-#2]<1*^-6&)],a≤#[[1]]≤b&&c≤#[[2]]≤d&]]]

First check if the derivative for the boat(x,y) equation is indeed correct (derivative of an implicit function: (dy/dx)=-(((∂/(∂x))boat(x,y))/((∂/(∂y))boat(x,y))))

Simplify[-((D[boat[x,y,x0,y0],x])/(D[boat[x,y,x0,y0],y]))]

boatD[x_,y_]:=({{\[Piecewise], ({{Infinity, x==y}, {((x+y)/(x-y)), True}})}});

Giving a starting point ((Subscript[x, 0]),(Subscript[y, 0])) a curve for the boat is defined. Along the curve the tangent is defined to enclose a 45° angle with the corresponding lighthouse line intersecting at that point. By changing the ray slope we can follow the boat along the curve.

plotRay[m_]:=Module[{intersection,tangent,maxX,maxY},
intersection=FindRoots2D[{boat[x,y,1,2],lighthouseImplicit[x,y,1,m]},{x,-4,4},{y,-4,4}];
tangent=({{\[Piecewise], ({{0.5*Normalize[{1,boatD[intersection[[1,1]],intersection[[1,2]]]}], m≠1}, {{0,0.5}, True}})}});

(* The curve should only be drawn to the intersection with the light ray. The values are chosenkind of manually *)
maxY=Max[intersection[[2,2]],-boatStartPoint[[2]]];
maxX=Max[intersection[[2,1]],({{\[Piecewise], ({{1.15, m≥1}, {0, True}})}})];

Show[
ContourPlot[boat[x,y,1,2]==0,{x,-maxX-0.05,maxX+0.05},{y,-maxY-0.05,maxY+0.05},
FrameLabel->{"x","y"},
PlotRange->{{-4,4},{-4,4}},
PlotLabel->"Lightray following the boat",
ImageSize->500,
BaseStyle->{FontSize->14},
PerformanceGoal->"Quality",
PlotPoints->40,
MaxRecursion->2,
PlotLegends->Column[{
LineLegend[{,Purple},{"Boat curve","Boat tangent"}],
PointLegend[{Brown,Red,LightRed,Darker[Green]},{"Boat starting point","Boat position","Lighthouse position","Angle checkpoint"}]
}],
Epilog->{
{Style[Point[checkpoint],Darker[Green],PointSize[0.02]]},
{Style[Point[intersection],Red,PointSize[0.02]]},
{Style[Point[{0,0}],LightRed,PointSize[0.02]]},
{Style[Point[{boatStartPoint,-boatStartPoint}],Brown,PointSize[0.02]]},
{Style[Line[{intersection[[1]]-tangent,intersection[[1]]+tangent}],Purple]},
{Style[Line[{intersection[[2]]-tangent,intersection[[2]]+tangent}],Purple]}
}
],
ContourPlot[boat[x,y,1,2]==0,{x,-4,4},{y,-4,4},
PerformanceGoal->"Quality",
PlotPoints->40,
MaxRecursion->2,
ContourStyle->Opacity[0.5]
],
Plot[lighthouse[x,1,m],{x,-4,4},
PlotStyle->LightRed,
PlotLegends->{"Lighthouse ray"}
]
]
];

Manipulate[
plotRay[m]
,{m,-2,2}
]

(*Export[FileNameJoin[{NotebookDirectory[],"frames/m=00.png"}],Table[plotRay[m],{m,-2,2,0.05}],"VideoFrames",Antialiasing->True];*)

To check if the angle between the lighthouse ray and the curve is indeed a 45° angle, we check the green marked position. The angle for the slope value at that position is (because the line goes through the origin, the slope value is just given by the fraction (y/x))

(Subscript[ϕ, ray])=ArcTan[((checkpoint[[2]])/(checkpoint[[1]]))](180/π)//N

The angle for the curve is defined by the tangent line at that point. To calculate the tangent line we need the slope value which is given by the ODE itself

(Subscript[ϕ, tangent])=ArcTan[boatD[checkpoint[[1]],checkpoint[[2]]]]*(180/π)//N

After the curve angle is mapped to a positive value, the difference is indeed a 45° angle

(180+(Subscript[ϕ, tangent]))-(Subscript[ϕ, ray])

Next, it would be interesting to see the different boat curves depending of the start position of the boat itself. This is given by the constant value (+C) from the ODE itself (already taken care of in the boat(x,y) equation).

xMin=-2;
xMax=2;
yMin=-2;
yMax=2;
step=0.1;

plotBoat[p_]:=Module[{x0,y0,funcs,tangent},
x0=p[[1]];
y0=p[[2]];
tangent=({{\[Piecewise], ({{0.4*Normalize[{1,boatD[x0,y0]}], x0≠y0}, {{0,0.4}, True}})}});

Show[
ContourPlot[{boat[x,y,x0,y0]==0,lighthouseImplicit[x,y,x0,y0]==0},{x,-2,2},{y,-2,2},
FrameLabel->{"x","y"},
PlotLabel->"Different boat starting point ("<>ToString[x0]<>","<>ToString[y0]<>")",
ImageSize->500,
BaseStyle->{FontSize->14},
ContourStyle->{,LightRed},
PerformanceGoal->"Quality",
PlotPoints->40,
MaxRecursion->2,
Epilog->{
{Style[Point[{-p,p}],Brown,PointSize[0.02]]},
{Style[Point[{0,0}],LightRed,PointSize[0.02]]},
{Style[Line[{p-tangent,p+tangent}],Purple]},
{Style[Line[{-p-tangent,-p+tangent}],Purple]}
},
PlotLegends->Column[{
LineLegend[{,Purple,LightRed},{"Boat curve","Boat tangent","Lighthouse ray"}],
PointLegend[{Brown,LightRed},{"Boat starting point","Lighthouse position"}]
}]
],
ListPlot[Table[{x,y},{x,xMin,xMax,step},{y,yMin,yMax,step}],PlotStyle->Directive[Gray,Opacity[0.2]]]
]];

Manipulate[
plotBoat[p]
,{{p,{1,1}},Locator,Appearance->None}
]

(*Do[
Export[
FileNameJoin[{
NotebookDirectory[],
"frames/x="<>
IntegerString[Round[((x-xMin)/step),1],10,2]<>
"y="<>
IntegerString[Round[((y-yMin)/step),1],10,2]<>
".png"
}],
plotBoat[{x,y}],
"VideoFrames",
Antialiasing->True
];
,{x,xMin,xMax,step},{y,yMin,yMax,step}]*)

Show[
ContourPlot[Evaluate@Table[boatD[x,y]==k,{k,{-2,-1,-0.5,0,0.5,1,2,10}}],{x,-2,2},{y,-2,2},
PerformanceGoal->"Quality",
PlotPoints->30,
MaxRecursion->2,
ContourStyle->Directive[Red,Opacity[0.4]],
PlotLegends->{"Isoclines"},
FrameLabel->{"x","y"},
PlotLabel->"Slope analysiation",
ImageSize->500,
BaseStyle->{FontSize->14}
],
VectorPlot[({{\[Piecewise], ({{{∞,∞}, x==y}, {{1,((x+y)/(x-y))}, True}})}}),{x,-2,2},{y,-2,2},
VectorScale->{Small,Small,None},
PlotLegends->{"Slopes"}
]
]

(Sqrt[((boatStartPoint[[1]])^2)+((boatStartPoint[[2]])^2)])

ArcTan[((boatStartPoint[[2]])/(boatStartPoint[[1]]))]*(180/π)

PolarPlot[Log[((Sqrt[((boatStartPoint[[1]])^2)+((boatStartPoint[[2]])^2)])/(E^(ArcTan[((boatStartPoint[[2]])/(boatStartPoint[[1]]))]-θ)))],{θ,0,5*π},
AxesLabel->{"ln(x)","ln(y)"},
ImageSize->500,
BaseStyle->{FontSize->14},
PlotLabel->"Polar plot (θ ∈ [0;5π])",
PlotLegends->{"r(θ) =((Subscript[r, 0])/(E^((Subscript[θ, 0]) - θ)))"}
]

ContourPlot[Evaluate@Table[boat[x,y,x0,y0],{x0,1,3,1},{y0,1,3,1}],{x,-5,5},{y,-5,5},PlotLegends->"Expressions",FrameLabel->{"x","y"}]

Manipulate[
ContourPlot[boatD[x,y]==k,{x,-2,2},{y,-2,2}]
,{k,-10,10}]