| intersect.line.circle {pcds} | R Documentation |
The points of intersection of a line and a circle
Description
Returns the intersection point(s) of a line and a circle. The line is determined by the two points
p1 and p2 and the circle is centered at point cent and has radius rad.
If the circle does not intersect the line, the function yields NULL;
if the circle intersects at only one point, it yields only that point;
otherwise it yields both intersection points as output.
When there are two intersection points, they are listed in the order of the x-coordinates of p1 and p2;
and if the x-coordinates of p1 and p2 are equal, intersection points are listed in the order of
y-coordinates of p1 and p2.
Usage
intersect.line.circle(p1, p2, cent, rad)
Arguments
p1, p2 |
2D points that determine the straight line (i.e., through which the straight line passes). |
cent |
A 2D point representing the center of the circle. |
rad |
A positive real number representing the radius of the circle. |
Value
point(s) of intersection between the circle and the line (if they do not intersect, the function
yields NULL as the output)
Author(s)
Elvan Ceyhan
See Also
Examples
P1<-c(.3,.2)*100
P2<-c(.6,.3)*100
cent<-c(1.1,1.1)*100
rad<-2*100
intersect.line.circle(P1,P2,cent,rad)
intersect.line.circle(P2,P1,cent,rad)
intersect.line.circle(P1,P1+c(0,1),cent,rad)
intersect.line.circle(P1+c(0,1),P1,cent,rad)
dist.point2line(cent,P1,P2)
rad2<-dist.point2line(cent,P1,P2)$d
intersect.line.circle(P1,P2,cent,rad2)
intersect.line.circle(P1,P2,cent,rad=.8)
intersect.line.circle(P1,P2,cent,rad=.78)
#plot of the line and the circle
A<-c(.3,.2); B<-c(.6,.3); cent<-c(1,1); rad<-2 #check dist.point2line(cent,A,B)$dis, .3
IPs<-intersect.line.circle(A,B,cent,rad)
xr<-range(A[1],B[1],cent[1])
xf<-(xr[2]-xr[1])*.1 #how far to go at the lower and upper ends in the x-coordinate
x<-seq(xr[1]-rad-xf,xr[2]+rad+xf,l=20) #try also l=100
lnAB<-Line(A,B,x)
y<-lnAB$y
Xlim<-range(x,cent[1])
Ylim<-range(y,A[2],B[2],cent[2]-rad,cent[2]+rad)
xd<-Xlim[2]-Xlim[1]
yd<-Ylim[2]-Ylim[1]
plot(rbind(A,B,cent),pch=1,asp=1,xlab="x",ylab="y",
xlim=Xlim+xd*c(-.05,.05),ylim=Ylim+yd*c(-.05,.05))
lines(x,y,lty=1)
interp::circles(cent[1],cent[2],rad)
IP.txt<-c()
if (!is.null(IPs))
{
for (i in 1:(length(IPs)/2))
IP.txt<-c(IP.txt,paste("I",i, sep = ""))
}
txt<-rbind(A,B,cent,IPs)
text(txt+cbind(rep(xd*.03,nrow(txt)),rep(-yd*.03,nrow(txt))),c("A","B","M",IP.txt))