library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(plotly)
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(gifski)
x=c(rep(10,500),seq(.5,1.5,length.out=1000), rep(1,500),rep(0,500),seq(1,1,length.out=1000), rep(1,500))
y=c(seq(-1,1,length.out=500),rep(1,1000), seq(-1,1,length.out=500),seq(-1,1,length.out=500),rep(0,1000), seq(-1,1,length.out=500))
z=rbind(x,y)
plot(y~x, xlim=c(-3,3), ylim=c(-3,3), col='green')
Now Lets write a function to left multiply (%>%) a square matrix (x)
against each of the vectors of points (y)
leftMultiply <- function(x,y){
x %*% y
}
leftMultiply(matrix(rep(seq(1,3, length.out=3),3), nrow = 3, ncol = 3),diag(3))
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 2 2 2
## [3,] 3 3 3
Shear To plot shear lets increase above 0 the element at the lower left corner of the identity matrix. As we increase it elements further away from the 0 line on the y axis are pulled either right (if positive) or left (if negative).
for (i in seq(0,1,length.out=20)) {
z1<-apply(z,2,function(x) leftMultiply(x,matrix(c(1,i,0,1),nrow=2,ncol=2)))
plot(z1[2,]~z1[1,], xlim=c(-3,3), ylim=c(-3,3), col='blue')
}
Scaling Scaling is accomplished as a simple multiplication of the
values
for (i in seq(1,6,length.out=20)) {
z1<-apply(z,2,function(x) leftMultiply(x,matrix(c(i,0,0,i),nrow=2,ncol=2,byrow=F)))
plot(z1[2,]~z1[1,], xlim=c(-3,3), ylim=c(-3,3), col='grey')
}
Rotation Rotation is accomplished by shear the matrix multiple times
using trigonometric functions.
for (i in seq(0,pi*2,length.out=20)) {
z1<-apply(z,2,function(x) leftMultiply(x,matrix(c(cos(i),-sin(i),sin(i),cos(i)),nrow=2,ncol=2)))
plot(z1[2,]~z1[1,], xlim=c(-3,3), ylim=c(-3,3), col='red')
}
Projection Projection is accomplished by updating the projection to
rotate around the Z axis.
for (i in seq(0,2*pi,length.out=20)) {
tempZ<-rbind(z,rep(0,ncol(z)))
z1<-apply(tempZ,2,function(x) leftMultiply(x,matrix(c(1,0,0,0,cos(i),-sin(i),0,sin(i),cos(i)),nrow=3,ncol=3)))
plot(z1[2,]~z1[1,], xlim=c(-3,3), ylim=c(-3,3), col='pink')
}