1. 程式人生 > >對於貝塞爾曲線的閉合方式

對於貝塞爾曲線的閉合方式

rpath har 判斷 eno 兩種 外部 pat 方法 clock

主要有兩種閉合方式

1.kCAFillRuleNonZero

這種的定義是從一個點發射一條射線,如果與其相交的線的方向自左向右則+1,如果自右向左則-1,如果穿過所有的線後其結果為0,則點在包含區域的外面,如果結果不為0則在包含區域內。以此來形成閉合區域,最直接的例子,一個矩形區域中放一個逆時針的圓,其包含區域就是圓和矩形之間的區域

[bpath appendPath:[UIBezierPath bezierPathWithRect:CGRectMake(50, 30, 315, 50)]];

[bpath appendPath:[UIBezierPath bezierPathWithArcCenter:self.maskView.center radius:100 startAngle:0 endAngle:2*M_PI clockwise:NO]];

2.kCAFillRuleEvenOdd

這種的判斷方法是通過一個點發射一條射線,判斷與邊界線的交點的個數,如果個數是奇數的則證明在包含區域的內部,如果是偶數則在外部。

這個相對好理解一點,例如一個封閉的圓,發射一條射線如果只有一個交點則在內部(不說切點)

CGRect myRect = CGRectMake(0, 0, 375, 667);

//背景

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:myRect cornerRadius:0];

//鏤空

UIBezierPath *circlePath = [UIBezierPath bezierPathWithRect:CGRectMake(30, 30, 315, 50)];

[path appendPath:circlePath];

[path setUsesEvenOddFillRule:YES];

CAShapeLayer *fillLayer = [CAShapeLayer layer];

fillLayer.path = path.CGPath;

fillLayer.fillRule = kCAFillRuleEvenOdd;//中間鏤空的關鍵點 填充規則

fillLayer.fillColor = [UIColor grayColor].CGColor;

self.maskView.layer.mask = fillLayer;

[self.view addSubview:self.maskView];

則可以做個鏤空的圖。

對於貝塞爾曲線的閉合方式