You are on page 1of 9

Міністерство освіти і науки України

Національний технічний університет України


«Київський політехнічний інститут ім. Ігоря Сікорського»
Факультет інформатики та обчислювальної техніки
Кафедра обчислювальної техніки

ЛАБОРАТОРНА РОБОТА № 5

з дисципліни «Комп’ютерна графіка»


на тему «Анімація»

ВИКОНАЛИ:
студенти 4 курсу ФІОТ
групи ІП-64
Соляніков
Вінницький
Варіант – 4

ПЕРЕВІРИВ:
Старший викладач
Саверченко В.Г.

Київ – 2019
ЗАВДАННЯ

1. По формулам лабораторної роботи №2 побудувати траєкторію і


відобразити рух по ній двох будь-яких об’єктів.
1. Дослідити характер руху цих об’єктів, змінюючи параметри Bj
(початкове положення, розміри, напрямок, швидкість, прискорення).
2. Розробити ефект при зіткненні двох об’єктів, змінюючи параметри Ck
(пропадання, зміна напрямку, злиття, візуальний ефект зіткнення та
інші).
2. Результати дослідження ілюструвати у висновках.

Варіант фігури у Лабораторній роботі


№2:
ВАРІАНТ №4

Програмний код

class ViewController: NSViewController{

var mainView: NSView = NSView(frame: NSMakeRect(0, 0, 0, 0))


let figureSize = 100

@IBOutlet weak var slider: NSSlider!


@IBOutlet weak var sliderA: NSSlider!
@IBOutlet weak var sliderB: NSSlider!
@IBOutlet weak var sliderR: NSSlider!

@IBAction func sliderChanged(_ sender: Any) {


print(slider!.integerValue)
self.createGraphics(A: Double(slider!.integerValue), B: 1, R: 10, from: 0, to: 2 * 3.14)
mainView.wantsLayer = true

mainView.layerContentsRedrawPolicy = .onSetNeedsDisplay

NSAnimationContext.runAnimationGroup({ context in
context.duration = 5.0
//mainView.animator().rotate(byDegrees: 10)

mainView.animator().frame = NSMakeRect(CGFloat(100 + slider!.integerValue), CGFloat(100 +


slider!.integerValue), CGFloat(500), CGFloat(500))
}, completionHandler: nil)

func makeOrnament2(){
removeAllSubViews()
removeAllSubLayers()
for i in 2...slider!.integerValue{
self.createGraphics1(A: Double(i), B: 1, R: 10, from: 0, to: 2 * 3.14)
}

mainView.wantsLayer = true
mainView.layerContentsRedrawPolicy = .onSetNeedsDisplay

NSAnimationContext.runAnimationGroup({ context in
context.duration = 5.0
//mainView.animator().rotate(byDegrees: 10)

mainView.animator().frame = NSMakeRect(CGFloat(100 + slider!.integerValue), CGFloat(100


+ slider!.integerValue), CGFloat(500), CGFloat(500))
}, completionHandler: nil)
}

override func viewDidLoad() {


super.viewDidLoad()
view.layer?.backgroundColor = .white
slider.minValue = 2
slider.maxValue = 30

mainView.wantsLayer = true
mainView.layer?.backgroundColor = NSColor.white.cgColor
self.view.addSubview(mainView)

//addMultipleOrnament(30, size : 4)
//addOrnament(4, size : 1)
//addFigure(size: 2)

override var representedObject: Any? {


didSet {
// Update the view, if already loaded.
}
}

func addFigure( size : Int){

removeAllSubViews()
removeAllSubLayers()
mainView.frame = NSMakeRect(50, 50, CGFloat(figureSize * size), CGFloat(figureSize * size))
let frame = CGRect(x:0, y: 0, width: figureSize * size, height: figureSize * size)
let line = Figure(frame: frame)
line.size = size
//line.layer?.backgroundColor = .clear
mainView.addSubview(line)
}

func addOrnament(_ index : Int, size : Int) {


removeAllSubViews()
removeAllSubLayers()
mainView.frame = NSMakeRect(50, 50, CGFloat(figureSize * index * size), CGFloat(figureSize *
index * size))

for i in 0..<index {
for j in 0..<index{
let frame = CGRect(x: i * figureSize * size, y: j * figureSize * size, width: figureSize * size,
height: figureSize * size)
let line = Figure(frame: frame)
line.size = size
line.layer?.backgroundColor = .clear
mainView.addSubview(line)
}

}
}

func addMultipleOrnament(_ index : Int, size : Int) {


removeAllSubViews()
removeAllSubLayers()
mainView.frame = NSMakeRect(50, 50, CGFloat(figureSize * size + 10 * index) + 10,
CGFloat(figureSize * size) + 10)

for i in 0..<index {
let frame = CGRect(x: i * 10, y:10, width: figureSize * size, height: figureSize * size)
let line = Figure(frame: frame)
line.size = size
line.layer?.backgroundColor = .clear
mainView.addSubview(line)

}
}

func createGraphics(A : Double, B : Double, R : Double, from : Double, to : Double){


removeAllSubViews()
removeAllSubLayers()
let lamda = 0.01
if from < to {
mainView.frame = NSMakeRect(50, 50, CGFloat(500) + 10, CGFloat(500) + 10)
var tempT : Double = from
var pointX : Double = ((A * R * cos(tempT)) + (B * R * cos(A * tempT))) + 250
var pointY : Double = ((A * R * sin(tempT)) - (B * R * sin(A * tempT))) + 250

let myPath = NSBezierPath()


while tempT < to {
myPath.move(to: CGPoint(x: pointX, y: pointY))
pointX = ((A * R * cos(tempT)) + (B * R * cos(A * tempT))) + 250
pointY = ((A * R * sin(tempT)) - (B * R * sin(A * tempT))) + 250
myPath.line(to: CGPoint(x: pointX, y: pointY))
tempT += lamda
print(pointX, pointY)
}
myPath.stroke()
let shapeLayer = CAShapeLayer()
shapeLayer.path = myPath.cgPath
shapeLayer.strokeColor = NSColor.red.cgColor
shapeLayer.fillColor = NSColor.red.cgColor
shapeLayer.lineWidth = 1.0
mainView.layer?.addSublayer(shapeLayer)

}
}

func createGraphics1(A : Double, B : Double, R : Double, from : Double, to : Double){


let lamda = 0.01
if from < to {
mainView.frame = NSMakeRect(50, 50, CGFloat(500) + 10, CGFloat(500) + 10)
var tempT : Double = from
var pointX : Double = ((A * R * cos(tempT)) + (B * R * cos(A * tempT))) + 250
var pointY : Double = ((A * R * sin(tempT)) - (B * R * sin(A * tempT))) + 250

let myPath = NSBezierPath()


while tempT < to {
myPath.move(to: CGPoint(x: pointX, y: pointY))
pointX = ((A * R * cos(tempT)) + (B * R * cos(A * tempT))) + 250
pointY = ((A * R * sin(tempT)) - (B * R * sin(A * tempT))) + 250
myPath.line(to: CGPoint(x: pointX, y: pointY))
tempT += lamda
print(pointX, pointY)
}
myPath.stroke()
let shapeLayer = CAShapeLayer()
shapeLayer.path = myPath.cgPath
shapeLayer.strokeColor = NSColor.red.cgColor
shapeLayer.fillColor = NSColor.red.cgColor
shapeLayer.lineWidth = 1.0
mainView.layer?.addSublayer(shapeLayer)

}
}

func removeAllSubViews (){


for view in mainView.subviews{
view.removeFromSuperview()
}
}
func removeAllSubLayers (){
guard let mainLayer = mainView.layer else {
return
}
guard let subLayers = mainLayer.sublayers else {return}
for layer in subLayers{
layer.removeFromSuperlayer()
}
}

import UIKit

class ViewController: UIViewController, UICollisionBehaviorDelegate {


var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!

var square: UIView!


var snap: UISnapBehavior!

@IBOutlet weak var activateGrav: UIButton!


@IBAction func activateFuncGrav(_ sender: Any) {

animator.removeBehavior(snap)

}
override func viewDidLoad() {
super.viewDidLoad()

square = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))

let imageName = "object"


let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
self.square.addSubview(imageView)
//Imageview on Top of View
self.square.bringSubview(toFront: imageView)

square.backgroundColor = UIColor.white
view.addSubview(square)

let barrier = UIView(frame: CGRect(x: 0, y: 300, width: 130, height: 20))


barrier.backgroundColor = UIColor.red
view.addSubview(barrier)

animator = UIDynamicAnimator(referenceView: view)


gravity = UIGravityBehavior(items: [square])
animator.addBehavior(gravity)

collision = UICollisionBehavior(items: [square])


collision.collisionDelegate = self
// add a boundary that has the same frame as the barrier
collision.addBoundary(withIdentifier: "barrier" as NSCopying, for: UIBezierPath(rect: barrier.frame))
//collision.addBoundaryWithIdentifier("barrier", forPath: UIBezierPath(rect: barrier.frame))
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)

let itemBehaviour = UIDynamicItemBehavior(items: [square])


itemBehaviour.elasticity = 0.6
animator.addBehavior(itemBehaviour)
}

func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem,


withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
print("Boundary contact occurred - \(identifier)")

let collidingView = item as! UIView


collidingView.backgroundColor = UIColor.yellow

UIView.animate(withDuration: 0.3, animations: {


collidingView.backgroundColor = UIColor.gray
})

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {


if (snap != nil) {
animator.removeBehavior(snap)
}

let touch = touches.first!


snap = UISnapBehavior(item: square, snapTo: touch.location(in: view))
animator.addBehavior(snap)
}
}

Результат роботи програми


Висновки:
1. Згідно Лабораторної роботи №2 була побудована траєкторія та
відображення руху двох об’єктів складного орнаменту по цій
траєкторії.

2. Дані об’єкти складного орнаменту рухаються по складній траєкторії не


залежно один від одного, при цьому дана траєкторія побудована таким
чином, що ці фігури по певним кривим цієї траєкторії будуть
прискорюватись, а рухаючись по інших кривих вони будуть
сповільнюватись. При частковому дотику, або ж при певному суміщенні цих
фігур вони будуть змінювати напрямок і рухатись по збудованій траєкторії,
але при цьому будуть або ж прискорюватись або ж сповільнюватись в
залежності від ситуації.

3. При зіткненні двох об’єктів складного орнаменту був запрограмований


ефект часткової зміни напрямку руху цих фігур, при чому фігури
будуть
рухатись по тій же траєкторії, але по певним кривим. Даний ефект схожий на
роботу двох шестерінок із часового механізму.

You might also like