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')
}