Slide 1

Slide 1 text

J04ͰάϥϑΛඳͨ͘Ίʹ ඞཁͳ஌ࣝ ʙ5SBDL"ϨΪϡϥʔτʔΫʢ෼ʣ

Slide 2

Slide 2 text

ελσΟϓϥεגࣜձࣾͰJ04ΤϯδχΞΛͯ͠·͢ ਢ౻ক࢙ʢ!LVSPUZBOOʣ

Slide 3

Slide 3 text

4UVEZQMVTͷάϥϑʢҰ෦ʣ

Slide 4

Slide 4 text

ຊ೔ͷτʔΫͰ࿩͢͜ͱ ෼ͱ͍͏୹͍࣌ؒͰ͕͢ άϥϑΛඳͨ͘Ίʹඞཁͳ஌ࣝΛ ͋ΔҰͭͷάϥϑͰՄೳͳݶΓઆ໌͠·͢

Slide 5

Slide 5 text

ͦΕ͸ԁάϥϑͰ͢

Slide 6

Slide 6 text

άϥϑͷલʹԁʢ୯Ґԁʣͷ͓͞Β͍ w ୈʙ̐৅ݶͷ஌͕ࣝඞཁ w ๮ંΕઢάϥϑ͸ୈ̍৅ݶͰ͋ Δ͜ͱ͕ଟ͘ɺඳը͸ͦΕ΄Ͳ ೉͘͠ͳ͍ w TJOВ DPTВ UBOВʢࡾ֯ؔ਺ʣɺ ϥδΞϯʢݽ౓๏ʣ w $PSF(SBQIJDT $PSF"OJNBUJPO y x ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ SBE

Slide 7

Slide 7 text

ԁάϥϑΛࣗ༝ʹඳ͘͜ͱ͕ग़དྷΕ͹ ଞͷछྨͷάϥϑ͸ԁάϥϑͷ஌ࣝΛ Ԡ༻ͯ͠΄΅ඳ͚ͦ͏ʂ ͱ͍͏͜ͱ͸ɾɾɾ

Slide 8

Slide 8 text

w 6*,JUͱ$PSF"OJNBUJPO͸ࠨ্۱ݪ఺ʢ6QQFS-FGU0SJHJOʣ Ͱɺ$PSF(SBQIJDT͸ࠨԼ۱ݪ఺ʢ-PXFS-FGU0SJHJOʣ w 6*#F[JFS1BUI͸ɺ$PSF(SBQIJDTͷύεؔ࿈ػೳΛϥοϓ͠ ͨ0CKFDUJWF$ͷϥούʔͰ6*,JUͷΫϥε w $"-BZFSʹ6*#F[JFS1BUIΛ$(1BUIͰ౉ͤ͹ɺΞχϝʔγϣ ϯͷௐ੔͕$"#BTJD"OJNBUJPOͰՄೳ J04ͷάϥϑඳըͷجຊ΋͓͞Β͍

Slide 9

Slide 9 text

άϥϑͰٻΊΒΕͦ͏ͳཁ݅Λͭఆٛ άϥϑͷඳը σʔλϥϕϧͷඳը Ξχϝʔγϣϯ δΣενϟʔ

Slide 10

Slide 10 text

αϯϓϧ1JF(SBQI4BNQMFS IUUQTHJUIVCDPNNBTBTIJTVUPV1JF(SBQI4BNQMFS

Slide 11

Slide 11 text

άϥϑͷඳը

Slide 12

Slide 12 text

"OHMFͳͷͰ֯౓ͩͳͱࢥ͏͚Ͳ // endAngle ͸ π / 2 = 90౓ let endAngle: CGFloat = .pi / 2 let path = UIBezierPath(arcCenter: .zero, radius: 100, startAngle: 0, endAngle: endAngle, clockwise: true)

Slide 13

Slide 13 text

֯౓Ͱ͸ͳ͘ހ౓ʢϥδΞϯʣ // endAngle ͸ π / 2 = 90౓ let endAngle: CGFloat = .pi / 2 let path = UIBezierPath(arcCenter: .zero, radius: 100, startAngle: 0, endAngle: endAngle, clockwise: true)

Slide 14

Slide 14 text

Ͱ΋ɺΠϝʔδͷ͠΍͍֯͢౓Ͱॻ͖͍ͨ // ֯౓ʢ90౓ʣΛހ౓ʢπ / 2ʣʹม׵͢Δ let endAngle = CGFloat(90.0.radianValue) let path = UIBezierPath(arcCenter: .zero, radius: 100, startAngle: 0, endAngle: endAngle, clockwise: true)

Slide 15

Slide 15 text

J04͔Β͸.FBTVSFNFOUͰม׵Մೳ extension Double { // ֯౓(degree) -> ހ౓(radian) var radianValue: Double { if #available(iOS 10.0, *) { let dm = Measurement(value: self, unit: UnitAngle.degrees) let rm = dm.converted(to: .radians) return rm.value } else { return self / 180 * .pi } } // ހ౓(radian) -> ֯౓(degree) var degreeValue: Double { if #available(iOS 10.0, *) { let rm = Measurement(value: self, unit: UnitAngle.radians) let dm = rm.converted(to: .degrees) return dm.value } else { return self * 180 / .pi } } }

Slide 16

Slide 16 text

αϯϓϧͷԁάϥϑͷඳ͖ํΛൈਮ // 0࣌ͷҐஔ͔Β։࢝ var startRad: Double = -90.0.radianValue for (index, data) in graphData.enumerated() { // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue // ઔܕͷ൒ܘ let arcRadius: Double = (index == selectedIndex) ? radius * 1.1 : radius // ઔܕ let arcPath = UIBezierPath(arcCenter: .zero, radius: CGFloat(arcRadius), startAngle: CGFloat(startRad), endAngle: CGFloat(startRad + rad), clockwise: true) arcPath.addLine(to: .zero) arcPath.close() arcLayers[index].path = arcPath.cgPath startRad += rad }

Slide 17

Slide 17 text

ඞཁͳͱ͖ʹ֯౓͔Βހ౓ʹม׵͢Δ // 0࣌ͷҐஔ͔Β։࢝ var startRad: Double = -90.0.radianValue for (index, data) in graphData.enumerated() { // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue // ઔܕͷ൒ܘ let arcRadius: Double = (index == selectedIndex) ? radius * 1.1 : radius // ઔܕ let arcPath = UIBezierPath(arcCenter: .zero, radius: CGFloat(arcRadius), startAngle: CGFloat(startRad), endAngle: CGFloat(startRad + rad), clockwise: true) arcPath.addLine(to: .zero) arcPath.close() arcLayers[index].path = arcPath.cgPath startRad += rad }

Slide 18

Slide 18 text

σʔλϥϕϧͷඳը

Slide 19

Slide 19 text

σʔλϥϕϧͷҐஔ͕஌Γ͍ͨ

Slide 20

Slide 20 text

Ґஔ͸ઔܕͷத৺͕ݟӫ͑ྑͦ͞͏ $(1PJOU͸ʁ $(1PJOU͸ʁ

Slide 21

Slide 21 text

TJOͰZ࣠ DPTͰY࣠ʢۃ࠲ඪˠ௚ަ࠲ඪʣ sinθ = y r → y = r * sinθ cosθ = x r → x = r * cosθ В y x S Y Z Y Z

Slide 22

Slide 22 text

ͭ·Γɺத৺͔Βͷ֯౓ͱ൒ܘͰҐஔ͕Θ͔Δ func arcTextPoint(arcCenter: CGPoint, radian: Double, radius: Double) -> CGPoint { // ൒ܘͷେ͖͞Ͱԁͷ಺΍֎ʹςΩετΛϨΠΞ΢τ let x = radius * cos(radian) let y = radius * sin(radian) return CGPoint(x: arcCenter.x + CGFloat(x), y: arcCenter.y + CGFloat(y)) }

Slide 23

Slide 23 text

ίʔυͰɺTJOͰZ࣠ DPTͰY࣠ func arcTextPoint(arcCenter: CGPoint, radian: Double, radius: Double) -> CGPoint { // ൒ܘͷେ͖͞Ͱԁͷ಺΍֎ʹςΩετΛϨΠΞ΢τ let x = radius * cos(radian) let y = radius * sin(radian) return CGPoint(x: arcCenter.x + CGFloat(x), y: arcCenter.y + CGFloat(y)) }

Slide 24

Slide 24 text

Ͱ͸ɺ࠾୒ϥϕϧΛઔܕͷத৺ʹ഑ஔ͢Δʹ͸ʁ

Slide 25

Slide 25 text

தԝͷന͍ԁͷ൒ܘ͕ԁάϥϑͷഒͷ৔߹ ̍

Slide 26

Slide 26 text

࠾୒ϥϕϧͷ൒ܘ͸ ̓ ̍

Slide 27

Slide 27 text

࠾୒ϥϕϧͷ֯౓͸ɺ࠾୒άϥϑͷ֯౓ͷ൒෼ ̓ ̍

Slide 28

Slide 28 text

࠾୒ϥϕϧͷ֯౓ͱ൒ܘ͕Θ͔ͬͨ ̓ ̍

Slide 29

Slide 29 text

αϯϓϧͷσʔλϥϕϧͷॻ͖ํΛൈਮ // 0࣌ͷҐஔ͔Β։࢝ var startRad: Double = -90.0.radianValue for (index, data) in graphData.enumerated() { // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue // ઔܕͷςΩετͷҐஔ let arcTextPoint: CGPoint = self.arcTextPoint(arcCenter: .zero, radian: startRad + rad / 2, radius: radius * 0.7) // ςΩετඳը arcTextLayers[index].position = arcTextPoint startRad += rad }

Slide 30

Slide 30 text

൒ܘΛഒɺ֯౓Λ൒෼ʹ͢Δ // 0࣌ͷҐஔ͔Β։࢝ var startRad: Double = -90.0.radianValue for (index, data) in graphData.enumerated() { // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue // ઔܕͷςΩετͷҐஔ let arcTextPoint: CGPoint = self.arcTextPoint(arcCenter: .zero, radian: startRad + rad / 2, radius: radius * 0.7) // ςΩετඳը arcTextLayers[index].position = arcTextPoint startRad += rad }

Slide 31

Slide 31 text

͞Βʹ൒ܘͷࢉग़Λެࣜʹ͓ͯ͘͠ // 0࣌ͷҐஔ͔Β։࢝ var startRad: Double = -90.0.radianValue for (index, data) in graphData.enumerated() { // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue // ઔܕͷςΩετͷҐஔ let arcTextRadius: Double = (radius + radius * centerCircleRadiusScale) / 2 let arcTextPoint: CGPoint = self.arcTextPoint(arcCenter: .zero, radian: startRad + rad / 2, radius: arcTextRadius) // ςΩετඳը arcTextLayers[index].position = arcTextPoint startRad += rad }

Slide 32

Slide 32 text

Ξχϝʔγϣϯ

Slide 33

Slide 33 text

ϧʔϨοτͷΑ͏ʹճస͢ΔΞχϝʔγϣϯ

Slide 34

Slide 34 text

$"#BTJD"OJNBUJPOͰରԠ // ԁάϥϑ let keyPath = "transform.rotation" let animation = CABasicAnimation(keyPath: keyPath) animation.beginTime = 0 animation.fromValue = 0.0.radianValue animation.toValue = 360.0.radianValue animation.duration = 0 animation.speed = 0.5 animation.repeatCount = .infinity animation.autoreverses = false // ఀࢭޙͷΞχϝʔγϣϯঢ়ଶΛҡ࣋ animation.isRemovedOnCompletion = false animation.fillMode = kCAFillModeForwards let key = "rotationAnimation" arcLayers.forEach { $0.add(animation, forKey: key) }

Slide 35

Slide 35 text

σʔλϥϕϧ͸ճస͠ͳ͍Α͏ʹٯճస // ԁάϥϑͷσʔλϥϕϧ let keyPath = "transform.rotation" let reverseAnimation = CABasicAnimation(keyPath: keyPath) reverseAnimation.beginTime = 0 // ٯʹճస reverseAnimation.fromValue = 360.0.radianValue reverseAnimation.toValue = 0.0.radianValue reverseAnimation.duration = 0 reverseAnimation.speed = 0.5 reverseAnimation.repeatCount = .infinity reverseAnimation.autoreverses = false reverseAnimation.isRemovedOnCompletion = false reverseAnimation.fillMode = kCAFillModeForwards let key = "rotationAnimation" arcTextLayers.forEach { $0.add(reverseAnimation, forKey: key) }

Slide 36

Slide 36 text

ӈଆͷը໘ͷֆจࣈϥϕϧ͸ճస͠ͳ͍

Slide 37

Slide 37 text

ॳճͷදࣔΞχϝʔγϣϯ

Slide 38

Slide 38 text

ͪ͜Β͸$"#BTJD"OJNBUJPOͩͱ೉͍͠ɾɾɾ w ಺ଆͷന͍ԁ͸൒ܘ͕૿Ճ w ֎ଆͷԁάϥϑ͸֯౓͕૿Ճ w ಺ଆ͸lUSBOTGPSNTDBMFzͰ΋ ରԠͰ͖ͦ͏͕ͩɺಉ࣌ʹ֎ଆͷ ԁͷ֯౓΋૿Ճͤ͞Δͷ͸ɺ $"#BTJD"OJNBUJPOͰ͸೉͍͠

Slide 39

Slide 39 text

$"%JTQMBZ-JOLͰϦϑϨογϡϨʔτͱಉظͯ͠ඳը✍ // Ξχϝʔγϣϯͷઃఆ private let curve: AnimationCurve = .ease private lazy var unitBezier = UnitBezier(p1: curve.p1, p2: curve.p2) @objc private func updatePathAnimation(_ sender: CADisplayLink) { guard let startTime = startTimeInterval else { return } let elapsed: Double = CACurrentMediaTime() - startTime // Ξχϝʔγϣϯਐḿ཰Λܭࢉ let progress = (elapsed > 1.0) ? 1.0 : CGFloat(elapsed / 1.0) let animationProgress = unitBezier.solve(t: progress) // άϥϑΛඳը setup(progress: Double(animationProgress)) if progress >= 1.0 { sender.invalidate() } }

Slide 40

Slide 40 text

ܦա࣌ؒʹ߹ͬͨΞχϝʔγϣϯਐḿ཰͸ʁ // Ξχϝʔγϣϯͷઃఆ private let curve: AnimationCurve = .ease private lazy var unitBezier = UnitBezier(p1: curve.p1, p2: curve.p2) @objc private func updatePathAnimation(_ sender: CADisplayLink) { guard let startTime = startTimeInterval else { return } let elapsed: Double = CACurrentMediaTime() - startTime // Ξχϝʔγϣϯਐḿ཰Λܭࢉ let progress = (elapsed > 1.0) ? 1.0 : CGFloat(elapsed / 1.0) let animationProgress = unitBezier.solve(t: progress) // άϥϑΛඳը setup(progress: Double(animationProgress)) if progress >= 1.0 { sender.invalidate() } }

Slide 41

Slide 41 text

ΞχϝʔγϣϯͷΠʔδϯάΛࣗ༝ʹ࡞Δ ࢀߟIUUQTUFDITUBSUUPEBZUFDIDPNFOUSZJPT@BOJNBUJPO@FBTJOH w !8PSME%PXO5PXO͞ΜͷهࣄΛࢀর w $".FEJB5JNJOH'VODUJPOͱಉ͡Α͏ʹɺΞχϝʔγϣϯ ͷܦա࣌ؒΛݩʹΞχϝʔγϣϯࣗମͷਐḿ཰Λܭࢉ w 8FC,JUͷϕδΣۂઢͷ$࣮૷Λ4XJGUͰॻ͖׵͑ͯରԠ // Ξχϝʔγϣϯਐḿ཰Λܭࢉ let progress = (elapsed > 1.0) ? 1.0 : CGFloat(elapsed / 1.0) let animationProgress = unitBezier.solve(t: progress) // ਐḿ཰Λ΋ͱʹͯ͠άϥϑΛඳը setup(progress: Double(animationProgress))

Slide 42

Slide 42 text

αϯϓϧͷॻ͖ํΛൈਮ // தԝʹന͍ԁʢ֎ଆͷԁͷ0.4ഒͷେ͖͞ʣΛஔ͘ let centerCirclePath = UIBezierPath(arcCenter: .zero, radius: CGFloat(radius * 0.4 * progress), startAngle: CGFloat(-90.0.radianValue), endAngle: CGFloat(270.0.radianValue), clockwise: true) centerCirclePath.addLine(to: .zero) centerCirclePath.close() // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue * progress

Slide 43

Slide 43 text

Ξχϝʔγϣϯͷਐḿ཰Λ͔͚Δ // தԝʹന͍ԁʢ֎ଆͷԁͷ0.4ഒͷେ͖͞ʣΛஔ͘ let centerCirclePath = UIBezierPath(arcCenter: .zero, radius: CGFloat(radius * 0.4 * progress), startAngle: CGFloat(-90.0.radianValue), endAngle: CGFloat(270.0.radianValue), clockwise: true) centerCirclePath.addLine(to: .zero) centerCirclePath.close() // ׂ߹ let ratio: Double = 360 * (data.value / graphDataTotal) // ϥδΞϯʢུɿradʣ let rad: Double = ratio.radianValue * progress

Slide 44

Slide 44 text

δΣενϟʔ

Slide 45

Slide 45 text

6*5BQ(FTUVSF3FDPHOJ[FS

Slide 46

Slide 46 text

6*5BQ(FTUVSF3FDPHOJ[FS

Slide 47

Slide 47 text

6*5BQ(FTUVSF3FDPHOJ[FS

Slide 48

Slide 48 text

6*5BQ(FTUVSF3FDPHOJ[FS

Slide 49

Slide 49 text

// ը໘ͷத৺Ͱ͸ͳ͘άϥϑͷத৺ʹ߹ΘͤͯλοϓҐஔΛม׵ let centerOffset = CGAffineTransform(translationX: -centerPoint.x, y: -centerPoint.y) let tappedPoint: CGPoint = gesture.location(in: self) .applying(centerOffset) if isDonuts { guard let centerCirclePath = centerCircleLayer?.path, !centerCirclePath.contains(tappedPoint) else { // தԝͷԁΛλοϓ resetNeedsTransform() return } } αϯϓϧͷॻ͖ํΛൈਮ

Slide 50

Slide 50 text

// ը໘ͷத৺Ͱ͸ͳ͘άϥϑͷத৺ʹ߹ΘͤͯλοϓҐஔΛม׵ let centerOffset = CGAffineTransform(translationX: -centerPoint.x, y: -centerPoint.y) let tappedPoint: CGPoint = gesture.location(in: self) .applying(centerOffset) if isDonuts { guard let centerCirclePath = centerCircleLayer?.path, !centerCirclePath.contains(tappedPoint) else { // தԝͷԁΛλοϓ resetNeedsTransform() return } } த৺͔Βλοϓ࠲ඪΛͣΒ͢ʁ

Slide 51

Slide 51 text

TVCMBZFSͷݪ఺͸MBZPVU4VCWJFXT Ͱௐ੔ override func layoutSubviews() { super.layoutSubviews() arcLayers.forEach { $0.frame.origin = centerPoint } centerCircleLayer?.frame.origin = centerPoint }

Slide 52

Slide 52 text

// ઔܕ let arcPath = UIBezierPath(arcCenter: .zero, radius: CGFloat(arcRadius), startAngle: CGFloat(startRad), endAngle: CGFloat(startRad + rad), clockwise: true) arcPath.addLine(to: .zero) arcPath.close() // தԝʹന͍ԁΛஔ͘ let centerCirclePath = UIBezierPath(arcCenter: .zero, radius: CGFloat(radius * 0.4), startAngle: CGFloat(-90.0.radianValue), endAngle: CGFloat(270.0.radianValue), clockwise: true) centerCirclePath.addLine(to: .zero) centerCirclePath.close() QBUI͸ݪ఺ʹඳը͢Δ

Slide 53

Slide 53 text

arcLayers[index].path = arcPath.cgPath centerCircleLayer?.path = centerCirclePath.cgPath ݪ఺ʹඳ͍ͨQBUIΛTVCMBZFSQBUIʹίϐʔ

Slide 54

Slide 54 text

λοϓͷ࠲ඪ͸ը໘Ͱ͸ͳ͘QBUIʹͦͬͯͣΒ͢ // ը໘ͷத৺Ͱ͸ͳ͘άϥϑͷத৺ʹ߹ΘͤͯλοϓҐஔΛม׵ let centerOffset = CGAffineTransform(translationX: -centerPoint.x, y: -centerPoint.y) let tappedPoint: CGPoint = gesture.location(in: self) .applying(centerOffset) if isDonuts { guard let centerCirclePath = centerCircleLayer?.path, !centerCirclePath.contains(tappedPoint) else { // தԝͷԁΛλοϓ resetNeedsTransform() return } }

Slide 55

Slide 55 text

͞ΒʹɺΞχϝʔγϣϯͰ࠲ඪ͕มԽͨ͠ͱ͖͸ʁ w TVCMBZFSQBUI͸ίϐʔͳͷ ͰΞχϝʔγϣϯޙͷมߋ ͕൓ө͞Εͳ͍

Slide 56

Slide 56 text

Ξχϝʔγϣϯޙͷঢ়ଶ͸QSFTFOUBUJPO // ແݶճస͕ఀࢭͨ͠ঢ়ଶͷϨΠϠʔ guard let presentation = layer.presentation() else { return } // ແݶճస͕ఀࢭͨ͠ϨΠϠʔ࠲ඪʹม׵ͯ͠ઔܕͷίϐʔΛ࠶࡞੒ let copyPath = UIBezierPath(cgPath: layerPath) copyPath.apply(presentation.affineTransform()) if copyPath.contains(tappedPoint) { // ઔܕΛλοϓ selectedIndex = (index == selectedIndex) ? nil : index // άϥϑΛ࠶ඳը setup(progress: 1.0, rotationRadian: Double(currentRotationRadian)) return }

Slide 57

Slide 57 text

ΞχϝʔγϣϯޙͷQBUIΛੜ੒ͯ͠൑ఆ // ແݶճస͕ఀࢭͨ͠ঢ়ଶͷϨΠϠʔ guard let presentation = layer.presentation() else { return } // ແݶճస͕ఀࢭͨ͠ϨΠϠʔ࠲ඪʹม׵ͯ͠ઔܕͷίϐʔΛ࠶࡞੒ let copyPath = UIBezierPath(cgPath: layerPath) copyPath.apply(presentation.affineTransform()) if copyPath.contains(tappedPoint) { // ઔܕΛλοϓ selectedIndex = (index == selectedIndex) ? nil : index // άϥϑΛ࠶ඳը setup(progress: 1.0, rotationRadian: Double(currentRotationRadian)) return }

Slide 58

Slide 58 text

6*1BO(FTUVSF3FDPHOJ[FS

Slide 59

Slide 59 text

6*1BO(FTUVSF3FDPHOJ[FS

Slide 60

Slide 60 text

υϥοά։͔࢝Βऴྃ·Ͱͷ֯౓͸ʁ

Slide 61

Slide 61 text

ઌʹ݁࿦Ͱ͕͢ɺ఺ͷ܏͖͸BUBOͰٻΊΒΕΔ

Slide 62

Slide 62 text

UBO BUBO BUBOͯɾɾɾ ࢀߟIUUQTRJJUBDPNLJNJ@ESPQDJUFNT FEDFCECEEBDPNNFOUBEFE w !LPIFSʢ͜ͻʔʣ͞Μͷίϝϯτ͕ࢀߟʹͳΓ·͢ w UBOВ͸Z࣠ͱY࣠ͷൺʢϥδΞϯʣ w BUBO͸UBOͷٯؔ਺ w BUBO͸൒प෼ʢ౓ʙ౓ʣͷൣғΛฦ͠ɺBUBO ͸̍प෼ʢ౓ʙ౓ʣͷൣғΛฦ͢

Slide 63

Slide 63 text

UBOВ͸Z࣠ͱY࣠ͷൺʢϥδΞϯʣ y x ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ › › w ౓ͷͱ͖ZY

Slide 64

Slide 64 text

BUBO͸UBOͷٯؔ਺

Slide 65

Slide 65 text

BUBO͸൒प෼ʢ౓ʙ౓ʣ y x ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ SBE ౓ ౓

Slide 66

Slide 66 text

BUBO͸൒प෼ʢ౓ʙ౓ʣͷൣғΛฦ͢ ౓Ͱ͸౓Ͱճసͤ͞Δͱ͖ʹࠔΔ

Slide 67

Slide 67 text

BUBO͸̍प෼ʢ౓ʙ౓ʣ y x ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ ୈ৅ݶ SBE ౓ ౓

Slide 68

Slide 68 text

BUBO͸̍प෼ʢ౓ʙ౓ʣͷൣғΛฦ͢

Slide 69

Slide 69 text

̎఺ͷBUBOͷࠩ෼ͰɺυϥοΫͨ֯͠౓Λܭࢉ

Slide 70

Slide 70 text

άϥϑͰٻΊΒΕͦ͏ͳཁ݅Λୡ੒ άϥϑͷඳը σʔλϥϕϧͷඳը Ξχϝʔγϣϯ δΣενϟʔ

Slide 71

Slide 71 text

·ͱΊ w ࡾ֯ؔ਺ͱހ౓๏͸άϥϑΛඳ্͘Ͱඞཁͳ஌ࣝͰ͢ʂ w ͜ΕͰϥΠϒϥϦʹཔΒͣάϥϑΛࣗ࡞͢Δ͜ͱ΋ग़དྷͦ͏ Ͱ͢Ͷʂ w Ϣʔβʔ͕تͿૉ੖Β͍͠άϥϑΛσβΠϯ͍ͨ͠ਓ45ɺ ࣮૷͍ͨ͠ਓ67͸ɺͥͻฐࣾͰҰॹʹಇ͖͠·͠ΐ͏

Slide 72

Slide 72 text

IUUQTHJUIVCDPNNBTBTIJTVUPV1JF(SBQI4BNQMFS ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠