public Bitboard ComputeRayIntersections(Bitboard bitboardToIntersect, Position movingPiecePosition, bool includeIntersectionPosition) { // Recompute this bitboard after stopping all rays from the moving piece that are intersecting the passed bitboard Bitboard newBitboard = new Bitboard(); // Compute a bitboard containing all intersection points Bitboard intersectBitboard = this.ComplementBitboard(this.IntersectBitboard(bitboardToIntersect)); int row; for (row = 0; row < this.bitboard.Length; row++) { newBitboard.GetBitboard()[row] = (byte)this.GetBitboard()[row]; intersectBitboard.GetBitboard()[row] = (byte)(intersectBitboard.GetBitboard()[row] & newBitboard.GetBitboard()[row]); } // Now, for each intersect position, go along the unit vector connecting the moving position to this position and wipe out all points till the edge of the bitboard // These "vectors" can only be horizontal, vertical or diagonal foreach (Position intersectionPosition in intersectBitboard.GetPositions()) { Vector2 positionVector = new Vector2(intersectionPosition.GetColumn() - movingPiecePosition.GetColumn(), intersectionPosition.GetRow() - movingPiecePosition.GetRow()); if (positionVector.x > 1 || positionVector.x < -1) { positionVector.x = positionVector.x / Mathf.Abs(positionVector.x); } if (positionVector.y > 1 || positionVector.y < -1) { positionVector.y = positionVector.y / Mathf.Abs(positionVector.y); } Position clearPosition = new Position(intersectionPosition.GetColumn(), intersectionPosition.GetRow()); if (includeIntersectionPosition) { // Don't process the intersection position clearPosition.SetColumn(clearPosition.GetColumn() + (int)positionVector.x); clearPosition.SetRow(clearPosition.GetRow() + (int)positionVector.y); } while (clearPosition.GetColumn() >= Position.min && clearPosition.GetColumn() <= Position.max && clearPosition.GetRow() >= Position.min && clearPosition.GetRow() <= Position.max) { if (newBitboard.ValueAtPosition(clearPosition) > 0) { newBitboard.FlipPosition(clearPosition); } else { break; } clearPosition.SetColumn(clearPosition.GetColumn() + (int)positionVector.x); clearPosition.SetRow(clearPosition.GetRow() + (int)positionVector.y); } } return(newBitboard); }
public Bitboard IntersectBitboard(Bitboard bitboardToIntersect) { Bitboard newBitboard = new Bitboard(); int row; // Get all intersections of this bitboard with the other for (row = 0; row < this.bitboard.Length; row++) { newBitboard.GetBitboard()[row] = (byte)((this.bitboard[row] ^ bitboardToIntersect.GetBitboard()[row]) & this.bitboard[row]); } return(newBitboard); }
public Bitboard ComplementBitboard(Bitboard bitboardToComplement) { Bitboard newBitboard = new Bitboard(); int row; for (row = 0; row < this.bitboard.Length; row++) { newBitboard.GetBitboard()[row] = (byte)~bitboardToComplement.GetBitboard()[row]; } return(newBitboard); }