private int InterpolateCorner(Vector2 position, Color[] colors, bool[] validFlags) { var result = 0; var xIndex = Array.BinarySearch <float>(xThresholds, position.x); var yIndex = Array.BinarySearch <float>(yThresholds, position.y); var index = xIndex + yIndex * xThresholds.Length; if (!validFlags[index]) { var nearestKey = material.keys.OrderBy(x => (x.position - position).sqrMagnitude) .First(); var nearestXIndex = Array.BinarySearch <float>(xThresholds, nearestKey.position.x); var nearestYIndex = Array.BinarySearch <float>(yThresholds, nearestKey.position.y); for (int y = Mathf.Min(yIndex, nearestYIndex), yMax = Mathf.Max(yIndex, nearestYIndex) + 1; y < yMax; ++y) { for (int x = Mathf.Min(xIndex, nearestXIndex), xMax = Mathf.Max(xIndex, nearestXIndex) + 1; x < xMax; ++x) { var i = x + y * xThresholds.Length; if (!validFlags[i]) { colors[i] = nearestKey.color; validFlags[i] = true; ++result; } } } } return(result); }
private void ModifyRectangle(VertexHelper vh, List <UIVertex> vertices, int[] rectangleIndices, GradationMaterial.Grid grid, Vector3[] localCorners, BaseTextMapping textMapping) { var rectangleVertices = rectangleIndices.Select(x => vertices[x]).ToArray(); var rectangleNormalizePositions = new Vector2[rectangleVertices.Length]; for (int i = 0, iMax = rectangleVertices.Length; i < iMax; ++i) { rectangleNormalizePositions[i] = new Vector2(Mathf.InverseLerp(localCorners[(int)RectangleIndex.UpperLeft].x, localCorners[(int)RectangleIndex.LowerRight].x, rectangleVertices[i].position.x) , Mathf.InverseLerp(localCorners[(int)RectangleIndex.LowerRight].y, localCorners[(int)RectangleIndex.UpperLeft].y, rectangleVertices[i].position.y) ); } GradationMaterial.Grid gridUnit = textMapping.GetGridUnit(rectangleIndices, rectangleNormalizePositions); var xMin = Array.BinarySearch <float>(gridUnit.xThresholds, rectangleNormalizePositions[(int)RectangleIndex.UpperLeft].x); if (xMin < 0) { xMin = ~xMin - 1; } var xMax = Array.BinarySearch <float>(gridUnit.xThresholds, rectangleNormalizePositions[(int)RectangleIndex.LowerRight].x); if (xMax < 0) { xMax = ~xMax; } var yMin = Array.BinarySearch <float>(gridUnit.yThresholds, rectangleNormalizePositions[(int)RectangleIndex.UpperLeft].y); if (yMin < 0) { yMin = ~yMin - 1; } var yMax = Array.BinarySearch <float>(gridUnit.yThresholds, rectangleNormalizePositions[(int)RectangleIndex.LowerRight].y); if (yMax < 0) { yMax = ~yMax; } for (int y = yMin; y < yMax; ++y) { for (int x = xMin; x < xMax; ++x) { ModifyRectangleGrid(vh, rectangleVertices, gridUnit, x, y, rectangleNormalizePositions); } } }
private void ModifyTriangle(VertexHelper vh, List <UIVertex> vertices, int[] triangleIndices, GradationMaterial.Grid grid, Vector3[] localCorners) { var triangleVertices = triangleIndices.Select(x => vertices[x]).ToArray(); var triangleNormalizePositions = new Vector2[triangleVertices.Length]; for (int i = 0, iMax = triangleVertices.Length; i < iMax; ++i) { triangleNormalizePositions[i] = new Vector2(Mathf.InverseLerp(localCorners[(int)RectangleIndex.UpperLeft].x, localCorners[(int)RectangleIndex.LowerRight].x, triangleVertices[i].position.x) , Mathf.InverseLerp(localCorners[(int)RectangleIndex.LowerRight].y, localCorners[(int)RectangleIndex.UpperLeft].y, triangleVertices[i].position.y) ); } var xMin = Array.BinarySearch <float>(grid.xThresholds, triangleNormalizePositions.Min(x => x.x)); if (xMin < 0) { xMin = ~xMin - 1; } var xMax = Array.BinarySearch <float>(grid.xThresholds, triangleNormalizePositions.Max(x => x.x)); if (xMax < 0) { xMax = ~xMax; } var yMin = Array.BinarySearch <float>(grid.yThresholds, triangleNormalizePositions.Min(x => x.y)); if (yMin < 0) { yMin = ~yMin - 1; } var yMax = Array.BinarySearch <float>(grid.yThresholds, triangleNormalizePositions.Max(x => x.y)); if (yMax < 0) { yMax = ~yMax; } for (int y = yMin; y < yMax; ++y) { for (int x = xMin; x < xMax; ++x) { ModifyTriangleGrid(vh, triangleVertices, grid, x, y, triangleNormalizePositions); } } }
public void CheckAnswer() { // Logic for checking answer if (gameWordsUIManager.GetCellStatus() == CellStatus.PARTIALY_FILLED) { instructionSoundManager.PlayPartiallyReactionSound("GameWords"); } bool result; userInput = GetInputFromUser(); string[] temp; int ansIndex = 0; if (!userInput.Contains(" ") && words [missionID].AnswersDict.TryGetValue((int)LevelComplexity, out temp)) { ansIndex = Array.BinarySearch(temp, userInput); } if (ansIndex > 0) { Debug.Log("ANSWER IS CORRECT -> " + ansIndex); result = true; instructionSoundManager.PlayRightCombinationSound("GameWords"); gameWordsUIManager.UpdateStarManager(currentQuestionIndex, result); currentQuestionIndex++; } else { Debug.Log("ANSWER IS WRONG -> " + ansIndex); instructionSoundManager.PlayWrongCombinationSound("GameWords"); if (maxAttempts > 0) { maxAttempts--; } if (maxAttempts == 0) { currentQuestionIndex++; } result = false; } if (onAnswerChecked != null) { onAnswerChecked(result); } }
private Color[] GetColors() { var keysCount = xThresholds.Length * yThresholds.Length; if (material.keys.Count == 0) { //有点キーが無いなら return(Enumerable.Repeat(Color.white, keysCount).ToArray()); } var validFlags = new bool[keysCount]; var emptyCount = keysCount; var result = new Color[keysCount]; //有点キー設定 foreach (var key in material.keys) { var xIndex = Array.BinarySearch <float>(xThresholds, key.position.x); var yIndex = Array.BinarySearch <float>(yThresholds, key.position.y); var index = xIndex + yIndex * xThresholds.Length; result[index] = key.color; validFlags[index] = true; --emptyCount; } if (emptyCount == 0) { return(result); } //角の無点キー補間 emptyCount -= InterpolateCorner(new Vector2(0.0f, 0.0f), result, validFlags); emptyCount -= InterpolateCorner(new Vector2(1.0f, 0.0f), result, validFlags); emptyCount -= InterpolateCorner(new Vector2(1.0f, 1.0f), result, validFlags); emptyCount -= InterpolateCorner(new Vector2(0.0f, 1.0f), result, validFlags); if (emptyCount == 0) { return(result); } //外周の無点キー補間 emptyCount -= InterpolateLine(0 , xThresholds.Length , 1 , x => xThresholds[x % xThresholds.Length] , result , validFlags ); emptyCount -= InterpolateLine(xThresholds.Length * (yThresholds.Length - 1) , keysCount , 1 , x => xThresholds[x % xThresholds.Length] , result , validFlags ); emptyCount -= InterpolateLine(0 , keysCount , xThresholds.Length , y => yThresholds[y / xThresholds.Length] , result , validFlags ); emptyCount -= InterpolateLine(xThresholds.Length - 1 , keysCount , xThresholds.Length , y => yThresholds[y / xThresholds.Length] , result , validFlags ); if (emptyCount == 0) { return(result); } //無点キー補間 for (int i = 0, iMax = keysCount; i < iMax; ++i) { emptyCount -= InterpolateCross(i, result, validFlags); } return(result); }