# Rotace přímky po 90° a zrcadlení podle os X a Y v programu R

# PhDr. Mgr. Jeroným Klimeš, Ph.D. 2020-07-23

# Máme obecnou rovnici přímky v rovině: y=ax+b, kde parametru "a" se říká anglicky slope neboli sklon a parametru "b" se anglicky říká intercept, neboli výsek/úsek na ose y. Pomocí těchto dvou parametrů se v programu R kreslí přímky pomocí příkazu: abline(intercept, slope).

# Narazil jsem na problém, jak tyto přímky otočit o 90°, popř. je zrcadlit. Samozřejmě pro matematiky úplná trivialita (analytická geometrie na úrovni střední školy), ale já jsem nad tím musel chvíli přemýšlet, tak předpokládám, že by se to někomu mohlo hodit.

# Na následujích obrázcích je červená přímka výchozí. Má intercept=1 a slope=2. Zjistíte si, jakou byste chtěli mít výchozí přímku, například zelenou, pak zelený text vám napoví, jak musíte transformovat parametry, aby vygenerovalo požadovanou transformaci.

# Následuje vlastní program v jazyku R


# z prikazove radky: R < operace_s_primkou.R --no-save  # takto se to spusti z prikazove radky
# source('operace_s_primkou.R') # takto se to spousti v R
setwd('/home/user/R/scripts/') # tady si nastavte cestu ke svym skriptum
options(digits=3) # zaokrouhlí výstup na tři číslice


# --- zrcadleni podle osy x a y ------------------------------------------
slope=2
intercept=1

par(pty="s") # nakreslí čtvercový graf
plot(0,0, type = "n", asp = 1,  bty="n", axes=F, ylab="", xlab="") # vypne osy
abline(h=0, col="yellow", untf = TRUE ) # nakreslí souřadnice
abline(v=0, col="yellow")
abline(intercept,slope, col="red", lwd=4) # y=2x+1; 
abline(intercept,-slope, col="blue", lwd=3) # zrcadli podle osy y
abline(-intercept,-slope, col="green", lwd=3) # zrcadli podle osy x
abline(-intercept ,slope, col="violet", lwd=3) # rotace o 180°, popř. symetrie podle [0; 0]
mtext("Zrcadlení přímky podle osy x a y", side = 3)
text(-.5,-1,  "[slope; intercept] [2; 1]", col = "red")
text(+.5, -1, "[-slope; intercept]", col = "blue")
text(-.5, +1, "[-slope; -intercept]", col = "green")
text(+.5, 1,  "[slope; -intercept]", col = "violet")
text(+.75, 0, "osa +X", col = "brown")
text(-.75, 0, "osa -X", col = "brown")
text(0,+.5,  "osa +Y", col = "brown")
text(0,-.5,  "osa -Y", col = "brown")
text(0,0,  "y=slope*x+intercept=ax+b", col = "brown")
pch = 22, cex = 2, col = "red") # kresli to do divnych koordinat
text(0,intercept-0.1,  "intercept", col = "brown")
dev.copy(png,
         filename="operace_s_primkou_zrcadleni_podle_osy_XY.png");
dev.off();

# --- rotace primky o 90° ------------------------------------------
intercept=1
slope=2
par(pty="s") # vynuti ctverec
plot(0,0, type = "n", asp = 1,  bty="n", axes=F, ylab="", xlab="")
abline(h=0, col="yellow", untf = TRUE )
abline(v=0, col="yellow")
abline(intercept,slope, col="red", lwd=4) # y=2x+1; y=0; x=-1/2=-(intercept/slope) Toto je trasformovaný sklon/slope. 
abline((intercept/slope),-1/slope, col="blue", lwd=3) # +90°
abline(-intercept,slope, col="green", lwd=3) # +180°
abline(-(intercept/slope),-1/slope, col="violet", lwd=3) # +270°
mtext("Rotace přímky po 90°", side = 3)
text(-.5,-1,  "[slope; intercept] [2; 1]", col = "red")
text(-.5, +1, "[-1/slope; intercept/slope]", col = "blue")
text(+.5, 1,  "[slope; -intercept]", col = "green")
text(+.5, -1, "[-1/slope; -intercept/slope]", col = "violet")
text(+.75, 0, "osa +X", col = "brown")
text(-.75, 0, "osa -X", col = "brown")
text(0,+.7,  "osa +Y", col = "brown")
text(0,-.7,  "osa -Y", col = "brown")
text(0.05,+.1,  "y=slope*x+intercept=ax+b", col = "brown")
text(0,intercept, "O", pch = 22, cex = 2, col = "red") 
text(0,intercept-0.1,  "intercept", col = "brown")
dev.copy(png,
         filename="operace_s_primkou_rotace_po_90_stupnu.png");
dev.off();

stop("konec experimentů s analytickou geometrií -------------------------------------------------------------\n")