Array index out of range error

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public class GridController : MonoBehaviour {

	// Get closest free point in grid 
	public Vector3 snapPoint (GameObject GroundObject, Vector3 hit){
		float worldX = 2F;
		float worldY = 2F;
		float worldZ = 2F;	
		bool IsGenerated = false;
		float snap = 0.1F; 
		List<Vector3> possiblePositionsList = new List<Vector3>();
		List<Vector3> tempPositionsList = new List<Vector3>();
		List<float> distanceList = new List<float>();
		int minIndex; // Shortest distance
		float minVal;

		this.transform.position = hit;
		Vector3 position = this.transform.position;
		position.x = Mathf.Round(position.x / snap) * snap;
		position.y = Mathf.Round(position.y / snap) * snap;
		position.z = Mathf.Round(position.z / snap) * snap;
		this.transform.position = position;
		Vector3 gridStart = transform.position - new Vector3(worldX / 2, worldY / 2, worldZ / 2);
		for(float x =0F; x<worldX; x += snap) {
			for(float y =0F; y<worldY; y += snap) {
				for(float z =0F; z<worldZ; z += snap) {
					Vector3 tempPosition;
					tempPosition = new Vector3(gridStart.x + x, gridStart.y + y, gridStart.z + z);
					tempPositionsList.Add(tempPosition);
				}
			}
		}
		IsGenerated = true;

		foreach (Vector3 tempPosition in tempPositionsList){
			GroundObject.transform.position = tempPosition;
			bool isFree = true;
				// Check is object free space WIP
			Collider[] hitColliders = Physics.OverlapSphere(GroundObject.transform.position, GroundObject.collider.bounds.extents.magnitude);
			foreach(Collider currentCollider in hitColliders){
				if(GroundObject.collider.bounds.Intersects(currentCollider.bounds)){
					int[] GroundObjectTriangles = GroundObject.transform.GetComponent<MeshFilter>().mesh.triangles;
					int[] otherTriangles = currentCollider.transform.GetComponent<MeshFilter>().mesh.triangles; 
					Vector3[] GroundObjectVertices = GroundObject.transform.GetComponent<MeshFilter>().mesh.vertices;
					Vector3[] otherVertices = currentCollider.transform.GetComponent<MeshFilter>().mesh.vertices; 
					int adjustedTriangleCount = GroundObjectTriangles.Length / 3;
					int otherAdjustedTriangleCount = otherTriangles.Length / 3;
					for(int i = 1; i < otherAdjustedTriangleCount; i ++){	// For every triangle in GroundObject...
						Debug.Log(otherAdjustedTriangleCount);
						Debug.Log((i - 1)*3);
						Debug.Log(GroundObjectTriangles.Length);
						for(int ib = 1; ib < adjustedTriangleCount; ib ++){	// For every triangle in other object...
							int[] aPoints = new int[3];
							aPoints[0] = GroundObjectTriangles[(i - 1)*3 + 0];
							aPoints[1] = GroundObjectTriangles[(i - 1)*3 + 1];
							aPoints[2] = GroundObjectTriangles[(i - 1)*3 + 2];
							Vector3 a1 = GroundObject.transform.TransformPoint(GroundObjectVertices[aPoints[0]]);
							Vector3 a2 = GroundObject.transform.TransformPoint(GroundObjectVertices[aPoints[1]]);
							Vector3 a3 = GroundObject.transform.TransformPoint(GroundObjectVertices[aPoints[2]]);
							int[] bPoints = new int[3];
							bPoints[0] = otherTriangles[(ib - 1)*3 + 0];
							bPoints[1] = otherTriangles[(ib - 1)*3 + 1];
							bPoints[2] = otherTriangles[(ib - 1)*3 + 2];
							Vector3 b1 = currentCollider.transform.TransformPoint(otherVertices[aPoints[0]]);
							Vector3 b2 = currentCollider.transform.TransformPoint(otherVertices[aPoints[1]]);
							Vector3 b3 = currentCollider.transform.TransformPoint(otherVertices[aPoints[2]]);
							if(TriTriOverlap.TriTriIntersect(a1, a2, a3, b1, b2, b3)){
								isFree = false;
							} 
						}
					}
			}
			} 
			if(isFree != false){
				possiblePositionsList.Add (tempPosition);
			}
		}
		foreach (Vector3 possiblePosition in possiblePositionsList){
			distanceList.Add(Vector3.Distance(possiblePosition, transform.position));
		} 
		minVal = distanceList.Min();
		minIndex = distanceList.IndexOf(minVal);	
		return possiblePositionsList[minIndex];
	}
}

In line 58. What’s wrong? I tried to replace them with 0, 1 and 2 and it crashed.

IndexOutOfRangeException: Array index is out of range.
GridController.snapPoint (UnityEngine.GameObject GroundObject, Vector3 hit) (at Assets/Game_scripts/GridController.cs:59)
BuildScript.FixedUpdate () (at Assets/Game_scripts/BuildScript.cs:70)

Updated 2 times.

You’re using wrong index. This:

GroundObjectTriangles[(i - 1)*3 + 0];

should be:

GroundObjectTriangles[(ib - 1)*3 + 0];