- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我画的弧是270度,两端都有圆锥形。这是很好的工作,但现在我想改变我的拱315°(-45°),但我的角计算不会工作。
我试过用不同的方法来计算,但似乎找不到当起点和终点不是垂直的或水平的时,为圆弧添加圆角的通用函数的公式。
这是我的操场守则:
import UIKit
import PlaygroundSupport
class ArcView: UIView {
private var strokeWidth: CGFloat {
return CGFloat(min(self.bounds.width, self.bounds.height) * 0.25)
}
private let cornerRadius: CGFloat = 10
override open func draw(_ rect: CGRect) {
super.draw(rect)
backgroundColor = UIColor.white
drawNormalCircle()
}
func drawNormalCircle() {
let strokeWidth = CGFloat(min(self.bounds.width, self.bounds.height) * 0.25)
let innerRadius = (min(self.bounds.width, self.bounds.height) - strokeWidth*2) / 2.0
let outerRadius = (min(self.bounds.width, self.bounds.height)) / 2.0
var endAngle: CGFloat = 270.0
let bezierPath = UIBezierPath(arcCenter: self.center, radius: outerRadius, startAngle: 0, endAngle: endAngle * .pi / 180, clockwise: true)
var point = bezierPath.currentPoint
point.y += cornerRadius
let arc = UIBezierPath(arcCenter: point, radius: cornerRadius, startAngle: 180 * .pi / 180, endAngle: 270 * .pi / 180, clockwise: true)
arc.apply(CGAffineTransform(rotationAngle: (360 - endAngle) * .pi / 180))
var firstCenter = bezierPath.currentPoint
firstCenter.y += cornerRadius
bezierPath.addArc(withCenter: firstCenter, radius: cornerRadius , startAngle: 270 * .pi / 180 , endAngle: 0, clockwise: true)
bezierPath.addLine(to: CGPoint(x: bezierPath.currentPoint.x, y: strokeWidth - cornerRadius))
var secondCenter = bezierPath.currentPoint
secondCenter.x -= cornerRadius
bezierPath.addArc(withCenter: secondCenter, radius: cornerRadius , startAngle: 0, endAngle: 90 * .pi / 180, clockwise: true)
bezierPath.addArc(withCenter: self.center, radius: innerRadius, startAngle: 270 * .pi / 180, endAngle: 0, clockwise: false)
var thirdCenter = bezierPath.currentPoint
thirdCenter.x += cornerRadius
bezierPath.addArc(withCenter: thirdCenter, radius: cornerRadius , startAngle: 180 * .pi / 180, endAngle: 270 * .pi / 180, clockwise: true)
bezierPath.addLine(to: CGPoint(x: bezierPath.currentPoint.x + strokeWidth - (cornerRadius * 2), y: bezierPath.currentPoint.y))
var fourthCenter = bezierPath.currentPoint
fourthCenter.y += cornerRadius
bezierPath.addArc(withCenter: fourthCenter, radius: cornerRadius , startAngle: 270 * .pi / 180, endAngle: 0, clockwise: true)
bezierPath.close()
let backgroundLayer = CAShapeLayer()
backgroundLayer.path = bezierPath.cgPath
backgroundLayer.strokeColor = UIColor.red.cgColor
backgroundLayer.lineWidth = 2
backgroundLayer.fillColor = UIColor.lightGray.cgColor
self.layer.addSublayer(backgroundLayer)
}
}
let arcView = ArcView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
PlaygroundPage.current.liveView = arcView
最佳答案
这是我的解决办法。
只是简单的三角学
/// Create a path made with 6 small subpaths
///
/// - Parameters:
/// - startAngle: the start angle of the path in cartesian plane angles system
/// - endAngle: the end angle of the path in cartesian plane angles system
/// - outerRadius: the radius of the outer circle in % relative to the size of the view that holds it
/// - innerRadius: the radius of the inner circle in % relative to the size of the view that holds it
/// - cornerRadius: the corner radius of the edges
///
/// - Returns: the path itself
func createPath(from startAngle: Double, to endAngle: Double,
outerRadius:CGFloat, innerRadius:CGFloat,
cornerRadius: CGFloat) -> UIBezierPath {
let path = UIBezierPath()
let maxDim = min(view.frame.width, view.frame.height)
let oRadius: CGFloat = maxDim/2 * outerRadius
let iRadius: CGFloat = maxDim/2 * innerRadius
let center = CGPoint.init(x: view.frame.width/2, y: view.frame.height/2)
let startAngle = deg2rad(360.0 - startAngle)
let endAngle = deg2rad(360.0 - endAngle)
// Outer Finish Center point
let ofcX = center.x + (oRadius - cornerRadius) * CGFloat(cos(endAngle - deg2rad(360)))
let ofcY = center.y + (oRadius - cornerRadius) * CGFloat(sin(endAngle - deg2rad(360)))
// Inner Finish Center point
let ifcX = center.x + (iRadius + cornerRadius) * CGFloat(cos(endAngle - deg2rad(360)))
let ifcY = center.y + (iRadius + cornerRadius) * CGFloat(sin(endAngle - deg2rad(360)))
// Inner Starting Center point
let iscX = center.x + (iRadius + cornerRadius) * CGFloat(cos(startAngle - deg2rad(360)))
let iscY = center.y + (iRadius + cornerRadius) * CGFloat(sin(startAngle - deg2rad(360)))
// Outer Starting Center point
let oscX = center.x + (oRadius - cornerRadius) * CGFloat(cos(startAngle - deg2rad(360)))
let oscY = center.y + (oRadius - cornerRadius) * CGFloat(sin(startAngle - deg2rad(360)))
// Outer arch
path.addArc(withCenter: center, radius: oRadius,
startAngle: startAngle, endAngle: endAngle,
clockwise: true)
// Rounded outer finish
path.addArc(withCenter: CGPoint(x: ofcX, y: ofcY), radius: cornerRadius,
startAngle: endAngle, endAngle:endAngle + deg2rad(90),
clockwise: true)
// Rounded inner finish
path.addArc(withCenter: CGPoint(x: ifcX, y: ifcY), radius: cornerRadius,
startAngle: endAngle + deg2rad(90), endAngle: endAngle + deg2rad(180),
clockwise: true)
// Inner arch
path.addArc(withCenter: center, radius: iRadius,
startAngle: endAngle, endAngle: startAngle,
clockwise: false)
// Rounded inner start
path.addArc(withCenter: CGPoint(x: iscX, y: iscY), radius: cornerRadius,
startAngle: startAngle + deg2rad(180), endAngle: startAngle + deg2rad(270),
clockwise: true)
// Rounded outer start
path.addArc(withCenter: CGPoint(x: oscX, y: oscY), radius: cornerRadius,
startAngle: startAngle + deg2rad(270), endAngle: startAngle,
clockwise: true)
return path
}
func deg2rad(_ number: Double) -> CGFloat {
return CGFloat(number * .pi / 180)
}
@IBOutlet weak var mainView: UIView!
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let borderLayer = CAShapeLayer()
borderLayer.path = createPath(from: 30, to: 120, outerRadius: 0.9, innerRadius: 0.3, cornerRadius: 5).cgPath
borderLayer.strokeColor = UIColor.orange.cgColor
borderLayer.fillColor = UIColor.orange.cgColor
borderLayer.lineWidth = 0.0
mainView.layer.addSublayer(borderLayer)
}
关于swift - 在315°圆弧上绘制圆角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912571/
我正在尝试让角色以弧形向目标扔东西。 我知道顶点(x,y)和目标(x,y),我想得到一条从原点(x,y)到目标的最大高度为 vertex.y 的弧 我所拥有的是基于 y = a(x-h)^2 + k
我正在使用 html5 canvas 创建财富之轮。它与填充样式颜色配合得很好。我想要随机切片填充样式图案中的两(2)个不同图像。我如何实现这一目标。 这是我的 JS function rand(mi
我不明白为什么我需要在某些 block 中有一个弱的 self ,而其他的似乎工作正常。 如果我在 Notification block 中没有对 self 的弱引用,dealloc 将不会被释放。不
我正在尝试弄清楚如何在极坐标图中的两点之间创建弧线,但我绘制的线是连接它们的直线,即使该图是极坐标。 我需要使用其他绘图函数来代替 ax.plot 吗? 我注意到 matplotlib 中有一些补丁,
我正在尝试在 d3 中创建一个半圆。使用 cardinal interpolation产生一条接近我想要的路径,但不够“圆形”。如何编写自己的插值器来更好地绕过这条路径,或者有更好的方法吗? 这是我目
我正在开发一个启用 ARC 的项目。我正在从 View Controller 中推送 MyClass, - (void)pushMyClass { MyClass *myClass = [[
我有四点。它是可拖动的。在任何时候我点击“绘制”按钮我想显示 Angular 。我尝试过,但它会在外面画出陡峭 Angular 弧线。但我想在形状内的任意点绘制圆弧。 $(document).read
我正在尝试为 Android 设备修改操纵杆组件。目前该组件能够跟踪您手指的 x 和 y 位置并在那里绘制一个小圆圈。现在我要做的是从中心到手指的 x 和 y 位置绘制一个矩形或圆弧。 据我所知,矩形
有没有人有在 svgwrite (python) 中完成的弧形切片(奶酪切片或吃 bean 人)的工作示例,我已经尝试过这个,试图获得一个从 (100,100) 开始的西北象限,但得到一个奇怪的形状:
我正在开发一个 iPad(仅限)应用程序,我偶然发现了一个奇怪的问题。该应用程序在 iPad 1 上出现内存警告后终止,但在 iPad 2 上运行正常。我正在使用 ARC 并以 iOS 5 为目标。我
dealloc(下)会释放静态变量exampleString指向的NSString吗? // ExampleClass.h @interface ExampleClass : NSObject @
我正在尝试使用 WPF 在 Canvas 上绘制导入的 DXF 文件。我一直在使用 DXFLib(可用 here)来读取和解析各种文件,它似乎工作得很好。 我现在正在绘制 DXF 中的所有实体,但我受
我正在使用 NSManagedObjects,我想返回任务的预算或任务类别的预算。 但是,该方法给出了错误: Implicit conversion of int to Budget * is dis
我正在使用 JQuery.path沿贝塞尔曲线移动对象。单击该项目时,我可以确定起点和终点。如何计算 Angular 和长度,使元素在与起点和终点相交的 1/4 圆弧上从 A 点移动到 B 点? 我基
当转换到 ARC 时,我收到以下编译器错误:“删除未使用的自动释放消息是不安全的”。 如果我简单地删除自动释放消息,obj 将在 getAutoreleasedObj 结束时立即被释放,这将导致 pr
我是 Instruments 的新手,但我之前已经成功地找到了漏洞。这一次,不是这样——每次我调用这段代码时都会有 34MB 的泄漏!我试图在下面发布所有相关代码,同时删除 DDLogging 等内容
我正在从手动内存管理过渡到 ARC,但遇到了问题。大多数时候,我通过在我的模型类中调用 performSelectorInBackground 来异步执行数据加载。问题是当模型收到 nil(发布)时,
我正在尝试将项目转换为使用 ARC。 我有一个这样的声明属性: @property (nonatomic, retain, setter=setSomeProperty:) SomeClass * s
在关于为特定类禁用 ARC 编译器机制的 stackoverflow 主题之后,我将 -fno-objc-arc 参数添加到 Compile Sources 部分(TARGETS 项目中的 Buil
考虑这个 ARC 代码: - (void)main { NSString *s = [[NSString alloc] initWithString:@"s"]; [NSApp beg
我是一名优秀的程序员,十分优秀!