# (x1, y1) と (x2, y2) を通る直線に,(x3, y3) からおろした垂線の長さを求める
# (x3, y3) から (x1, y1) と (x2, y2) を通る直線への距離を求める
prog <- function(x1, y1, x2, y2, x3, y3)
{
a <- (y2-y1)/(x2-x1)
x <- (x3/a+y3+a*x1-y1)/(a+1/a)
y <- a*(x-x1)+y1
return(c(x=x, y=y, l=sqrt((x-x3)^2+(y-y3)^2)))
}
# 以下は,利用法と説明図を描くためのプログラム
line2 <- function(x1, y1, x2, y2)
{
abline(y1-(y2-y1)/(x2-x1)*x1, (y2-y1)/(x2-x1), col="green")
}
x1 <- 1; y1 <- 3
x2 <- 5; y2 <- 5
x3 <- 2; y3 <- 6
(ans <- prog(x1, y1, x2, y2, x3, y3))
par(xpd=TRUE, mar=c(5, 5, 2, 2))
x <- ans["x"]
y <- ans["y"]
l <- ans["l"]
plot(c(x1, x2, x3, x), c(y1, y2, y3, y), pch=19, xlab="x", ylab="y", asp=1)
line2(x1, y1, x2, y2)
segments(x3, y3, x, y, col="red")
abline(v=x, h=y, col="blue", lty=3)
text(c(x1, x2, x3), c(y1, y2, y3), paste("(x", 1:3, ", y", 1:3, ")", sep=""), pos=4)
text(x, y, "(x, y)", pos=4)
実行により,
x y l
3.000000 4.000000 2.236068
を得る。
# (x3, y3) から (x1, y1) と (x2, y2) を通る直線への距離を求める
prog <- function(x1, y1, x2, y2, x3, y3)
{
a <- (y2-y1)/(x2-x1)
x <- (x3/a+y3+a*x1-y1)/(a+1/a)
y <- a*(x-x1)+y1
return(c(x=x, y=y, l=sqrt((x-x3)^2+(y-y3)^2)))
}
# 以下は,利用法と説明図を描くためのプログラム
line2 <- function(x1, y1, x2, y2)
{
abline(y1-(y2-y1)/(x2-x1)*x1, (y2-y1)/(x2-x1), col="green")
}
x1 <- 1; y1 <- 3
x2 <- 5; y2 <- 5
x3 <- 2; y3 <- 6
(ans <- prog(x1, y1, x2, y2, x3, y3))
par(xpd=TRUE, mar=c(5, 5, 2, 2))
x <- ans["x"]
y <- ans["y"]
l <- ans["l"]
plot(c(x1, x2, x3, x), c(y1, y2, y3, y), pch=19, xlab="x", ylab="y", asp=1)
line2(x1, y1, x2, y2)
segments(x3, y3, x, y, col="red")
abline(v=x, h=y, col="blue", lty=3)
text(c(x1, x2, x3), c(y1, y2, y3), paste("(x", 1:3, ", y", 1:3, ")", sep=""), pos=4)
text(x, y, "(x, y)", pos=4)
実行により,
x y l
3.000000 4.000000 2.236068
を得る。
※コメント投稿者のブログIDはブログ作成者のみに通知されます