/* * Copyright 2012 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import "ZXMathUtils.h" #import "ZXResultPoint.h" @implementation ZXResultPoint - (id)initWithX:(float)x y:(float)y { if (self = [super init]) { _x = x; _y = y; } return self; } + (id)resultPointWithX:(float)x y:(float)y { return [[self alloc] initWithX:x y:y]; } - (id)copyWithZone:(NSZone *)zone { return [[ZXResultPoint allocWithZone:zone] initWithX:self.x y:self.y]; } - (BOOL)isEqual:(id)other { if ([other isKindOfClass:[ZXResultPoint class]]) { ZXResultPoint *otherPoint = (ZXResultPoint *)other; return self.x == otherPoint.x && self.y == otherPoint.y; } return NO; } - (NSUInteger)hash { return 31 * *((int *)(&_x)) + *((int *)(&_y)); } - (NSString *)description { return [NSString stringWithFormat:@"(%f,%f)", self.x, self.y]; } + (void)orderBestPatterns:(NSMutableArray *)patterns { float zeroOneDistance = [self distance:patterns[0] pattern2:patterns[1]]; float oneTwoDistance = [self distance:patterns[1] pattern2:patterns[2]]; float zeroTwoDistance = [self distance:patterns[0] pattern2:patterns[2]]; ZXResultPoint *pointA; ZXResultPoint *pointB; ZXResultPoint *pointC; if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { pointB = patterns[0]; pointA = patterns[1]; pointC = patterns[2]; } else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { pointB = patterns[1]; pointA = patterns[0]; pointC = patterns[2]; } else { pointB = patterns[2]; pointA = patterns[0]; pointC = patterns[1]; } if ([self crossProductZ:pointA pointB:pointB pointC:pointC] < 0.0f) { ZXResultPoint *temp = pointA; pointA = pointC; pointC = temp; } patterns[0] = pointA; patterns[1] = pointB; patterns[2] = pointC; } + (float)distance:(ZXResultPoint *)pattern1 pattern2:(ZXResultPoint *)pattern2 { return [ZXMathUtils distance:pattern1.x aY:pattern1.y bX:pattern2.x bY:pattern2.y]; } /** * Returns the z component of the cross product between vectors BC and BA. */ + (float)crossProductZ:(ZXResultPoint *)pointA pointB:(ZXResultPoint *)pointB pointC:(ZXResultPoint *)pointC { float bX = pointB.x; float bY = pointB.y; return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); } @end