我正在制作一个能够绘制基本细胞自动机的应用程序。目前我正在使用UIBezierPath在自定义UIView中绘制单元格:
var path : UIBezierPath
for (heightIndex, row) in stateMatrix!.enumerate() {
for (widthIndex, cell) in row!.enumerate() {
let myRect = CGRect(x: cellWidth * CGFloat(widthIndex), y: cellWidth * CGFloat(heightIndex), width: cellWidth, height: cellWidth)
path = UIBezierPath(rect: myRect)
if cell == "x" {
Constants.OnColor.setFill()
Constants.OnColor.setStroke()
} else {
Constants.OffColor.setFill()
Constants.OffColor.setStroke()
}
path.fill()
path.stroke()
}
}
我正在绘制的网格大约是n * 6n个单元格。当n很小时,这个代码工作正常,但它显然不能很好地扩展(在我的iPhone 4s上,n = 150,大约需要一分半钟)。显然,必须有一个更好的方法来做到这一点,而不是调用UIBezierPath几十万次。什么是更好的方法来解决这个问题?
答案 0 :(得分:1)
您为什么使用UIBezierPath
?对于150 * 150的正方形,花费这么多时间处理它是正常的(https://en.wikipedia.org/wiki/Bézier_curve)。您可以使用UIBezierPath
来代替CoreGraphics
而不是int side = 100; // number of squares in one side
int delta = 300 / side;
for (int i = 0; i < side; i++) {
for (int j = 0; j < side; j++) {
CGRect rectangle = CGRectMake(delta * i, delta * j, delta, delta);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 0.5);
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 0.5);
CGContextFillRect(context, rectangle);
CGContextStrokeRect(context, rectangle);
}
}
。这是Obj-C中的一个例子:
2016-01-09 23:55:02.677
2016-01-09 23:55:02.741
此示例绘制此正方形所需的时间不到0.1秒。
import cv2
import numpy as np
import imutils
lower = np.array([0, 48, 80], dtype= "uint8")
upper = np.array([20, 255, 255], dtype= "uint8")
img = cv2.imread('3.JPG', 0)
img = imutils.resize(img, width = 400)
cv2.waitKey(1)
converted = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
new_skinMask = cv2.inRange(converted, lower, upper)