public DataGridView Pack_Elements(int Table_length, int Table_width, DataGridView Elements) { // // Packing elements in sequence along X axis of table, // with horizontal orientation exclusively. // // Algorithm has optimisation for adjusting area // of positions along X axes // // // This method needs three arguments and returns one argument. // Table_length, Table_width and DataGridView Elements. // // Structure of DataGridView that is going to be passed as argument, // from caller method, must be the same as structure of // DataGridView ELEMENT_LIST. // // Method returns DataGridView TABLE_LIST with data // of packed elements: index, x, y, length and width. // // // // Initialize_Tables(); // // // Initialize_Variables(); // // Set table length and width // Tl = Table_length; Tw = Table_width; // // Copy element dimensions from DataGridView Elements // to ELEMENT_LIST table and format it's values // // Set elements counter to zero n = 0; // Set table row counter to zero i = 0; // Fill ELEMENT_LIST for (i = 0; i < Elements.RowCount; i++) { if (Elements[1, i].Value != null) { ELEMENT_LIST.Rows.Add(); ELEMENT_LIST[0, i].Value = (int.Parse(Elements[0, i].Value.ToString())).ToString(format); ELEMENT_LIST[1, i].Value = (int.Parse(Elements[1, i].Value.ToString())).ToString(format); ELEMENT_LIST[2, i].Value = (int.Parse(Elements[2, i].Value.ToString())).ToString(format); ELEMENT_LIST[3, i].Value = (int.Parse(Elements[3, i].Value.ToString())).ToString(format); ELEMENT_LIST[4, i].Value = (int.Parse(Elements[4, i].Value.ToString())).ToString(format); // Increase elements counter by one n++; } } // // Sort elements in descending sort order // first by area then by length then by width of elements // ELEMENT_LIST.Sort(ELEMENT_LIST.Columns[3], ListSortDirection.Descending); // Set position coordinates to origin p_X = 0; p_Y = 0; // // Enter coordinates and dimensions // of first position in table 'POSITION_LIST' // POSITION_LIST.Rows.Add(p_X.ToString(format), // X coordinate p_Y.ToString(format), // Y coordinate Tl.ToString(format), // table lenght Tw.ToString(format)); // table width // Set position counter to one k = 1; // Set counter of packed elements to zero p = 0; // // Pack elements while there is free positions and // elements for packing // while (k > 0 && n > 0) { // Sort positions in ascending sort order first by Y, and then by X axes POSITION_LIST.Sort(POSITION_LIST.Columns[1], ListSortDirection.Ascending); // Get length and width of first position in 'POSITION_LIST' Pl = int.Parse(POSITION_LIST[2, 0].Value.ToString()); Pw = int.Parse(POSITION_LIST[3, 0].Value.ToString()); // Calculate fitting factor for each element for the first position for (i = 0; i < n; i++) { // Element length l = int.Parse(ELEMENT_LIST[1, i].Value.ToString()); // Element width w = int.Parse(ELEMENT_LIST[2, i].Value.ToString()); // Set fitting factor initial value f = 0; // Does element fits inside position if (Pl < l || Pw < w) { // If not f = 0; } else { // If yes f++; // if (Pl == l) { // If element fits exactly across lenght of position f++; } // if (Pw == w) { // If element fits exactly across width of position f++; } } // Enter fitting factor value inside ELEMENT_LIST table ELEMENT_LIST[4, i].Value = f.ToString(format); } // // Sort elements in descending sort order first by fitting factor value, // then by area then by length then by width of elements // ELEMENT_LIST.Sort(ELEMENT_LIST.Columns[4], ListSortDirection.Descending); // // Get fitting factor value for the first element // f = int.Parse(ELEMENT_LIST[4, 0].Value.ToString()); // // If fitting factor is greater than zero // element can be packed inside selected position // if (f > 0) { // // Get coordinates of selected position // p_X = int.Parse(POSITION_LIST[0, 0].Value.ToString()); p_Y = int.Parse(POSITION_LIST[1, 0].Value.ToString()); // Get index, length and width of packed element x = int.Parse(ELEMENT_LIST[0, 0].Value.ToString()); l = int.Parse(ELEMENT_LIST[1, 0].Value.ToString()); w = int.Parse(ELEMENT_LIST[2, 0].Value.ToString()); // // Enter coordinates of position, // element dimensions and index, // at TABLE LIST // TABLE_LIST.Rows.Add(); TABLE_LIST[0, p].Value = x.ToString(); // index TABLE_LIST[1, p].Value = p_X.ToString(); // position x TABLE_LIST[2, p].Value = p_Y.ToString(); // position y TABLE_LIST[3, p].Value = l.ToString(); // element length TABLE_LIST[4, p].Value = w.ToString(); // element width // Increase packed elements counter by one p++; // Erase packed element from list of elements ELEMENT_LIST.Rows.RemoveAt(0); // Decrease elements counter by one n--; // // If there is free elements left // seek for new positions // if (n > 0) { // // Sort elements in descending sort order, // first by area then by length then by width of elements // // This step is necessary for faster searching // for element that can fit inside new positions // // And the elements are sorted accordingly to demand of // second restriction in algorithm development // for the next step in packing process // ELEMENT_LIST.Sort(ELEMENT_LIST.Columns[3], ListSortDirection.Descending); // Set new position 'is adequate' state flag P_ok = true; // // New position II with coordinates // at upper left corner of previous // packed element // if (Pw > w) { // // Initialize local variables // X12 = 0; Y12 = 0; L12 = 0; W12 = 0; A12 = 0; // Set new position 'is adequate' state flag P_ok = false; // // Coordinates of new position II // X12 = p_X; Y12 = p_Y + w; // // Length, width and area of new position II // L12 = Tl - X12; W12 = Pw - w; A12 = L12 * W12; // // Find is there element left that can fit inside position // // Set ELEMENT_LIST table counter value i = n - 1; // // Get area of the last element in table // a = int.Parse(ELEMENT_LIST[3, i].Value.ToString()); while (a <= A12 && i > -1) { // // Get next element area // a = int.Parse(ELEMENT_LIST[3, i].Value.ToString()); // // Get element length and width value // Lmin = int.Parse(ELEMENT_LIST[1, i].Value.ToString()); Wmin = int.Parse(ELEMENT_LIST[2, i].Value.ToString()); // // If element can fit // at observed position, // set new position II at list of positions // if (L12 >= Lmin && W12 >= Wmin) { POSITION_LIST.Rows.Add(X12.ToString(format), Y12.ToString(format), L12.ToString(format), W12.ToString(format)); // Increase positions counter by one k++; // Set new position 'is adequate' state flag P_ok = true; // Set counter value to loop exit value i = -1; } // Decrease elements counter by one i--; } } // // New position I with coordinates // at lower right corner of previous // packed element // if (Pl > l) { // // Initialize local variables // X11 = 0; Y11 = 0; L11 = 0; W11 = 0; A11 = 0; // // Coordinates of new position I // X11 = p_X + l; Y11 = p_Y; // // Length, width and area of new position I // L11 = Tl - X11; W11 = w; A11 = L11 * W11; // // If position two is inadeqate, // adjust width of position one // if (!P_ok) { W11 = W11 + W12; A11 = L11 * W11; } // // Find is there element left that can fit inside position // // Set element counter value i = n - 1; // // Get area of the last element in table // a = int.Parse(ELEMENT_LIST[3, i].Value.ToString()); while (a <= A11 && i > -1) { // // Get next element area // a = int.Parse(ELEMENT_LIST[3, i].Value.ToString()); // // Get element length and width value // Lmin = int.Parse(ELEMENT_LIST[1, i].Value.ToString()); Wmin = int.Parse(ELEMENT_LIST[2, i].Value.ToString()); // // If there is element that can fit // at position, // set new position I at list of positions // if (L11 >= Lmin && W11 >= Wmin) { POSITION_LIST.Rows.Add(X11.ToString(format), Y11.ToString(format), L11.ToString(format), W11.ToString(format)); // Increase positions counter by one k++; // Set counter value to loop exit value i = -1; } // Decrease elements counter by one i--; } } } } // // Is there free elements left for packing // if (n > 0) { // // Erase first position from list // POSITION_LIST.Rows.RemoveAt(0); // Decrease positions counter by one k--; } } // // End of packing process // return(TABLE_LIST); }
// Update is called once per frame void Update() { NowCursorState = tmpCursor.GetComponent <AnimatedCursor>().tmpCursorState; PlaceBtnState = PlaceButton.GetComponent <ButtonInteraction>().NowButtonState; DeleteBtnState = DeleteButton.GetComponent <ButtonInteraction>().NowButtonState; CancelBtnState = CancelButton.GetComponent <ButtonInteraction>().NowButtonState; lineRenderer = GetComponent <LineRenderer>(); //Debug.Log("Cursor Position: " + tmpCursor.transform.position); //Vector3 CursorPosition = tmpCursor.GetComponent<Transform>().position; if ((ButtonInteraction.PosState == PosButtonType.PLACE) && (NowCursorState == CursorStateEnum.Release) && (PlaceBtnState != ButtonStateEnum.Targeted) && (PlaceBtnState != ButtonStateEnum.Pressed) && (DeleteBtnState != ButtonStateEnum.Observation) && (CancelBtnState != ButtonStateEnum.Observation)) { if (SizeButtonCollection.SizeButtonState == SizeButtonType.MEDIUM) { offset = 6.0f; } else if (SizeButtonCollection.SizeButtonState == SizeButtonType.LARGE) { offset = 8.0f; } else if (SizeButtonCollection.SizeButtonState == SizeButtonType.SMALL) { offset = 5.0f; } Vector3 FinalPos = tmpCursor.transform.position - new Vector3(0f, 0f, 0.1f) * offset; Instantiate(PlaneObject, FinalPos, transform.rotation, this.transform); //Genarate the drone ChildCount = this.transform.childCount; /*Use to process the three Red Light*/ if (ChildCount > 1) { Vector3 pos1, pos2; //the position of two way point(drone) Vector3 p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18; //Red light initial position pos1 = this.gameObject.transform.GetChild(ChildCount - 2).transform.position; pos2 = this.gameObject.transform.GetChild(ChildCount - 1).transform.position; p0 = (pos1 * 1 + pos2 * 19) / 20; p1 = (pos1 * 2 + pos2 * 18) / 20; p2 = (pos1 * 3 + pos2 * 17) / 20; p3 = (pos1 * 4 + pos2 * 16) / 20; p4 = (pos1 * 5 + pos2 * 15) / 20; p5 = (pos1 * 6 + pos2 * 14) / 20; p6 = (pos1 * 7 + pos2 * 13) / 20; p7 = (pos1 * 8 + pos2 * 12) / 20; p8 = (pos1 * 9 + pos2 * 11) / 20; p9 = (pos1 * 10 + pos2 * 10) / 20; p10 = (pos1 * 11 + pos2 * 9) / 20; p11 = (pos1 * 12 + pos2 * 8) / 20; p12 = (pos1 * 13 + pos2 * 7) / 20; p13 = (pos1 * 14 + pos2 * 6) / 20; p14 = (pos1 * 15 + pos2 * 5) / 20; p15 = (pos1 * 16 + pos2 * 4) / 20; p16 = (pos1 * 17 + pos2 * 3) / 20; p17 = (pos1 * 18 + pos2 * 2) / 20; p18 = (pos1 * 19 + pos2 * 1) / 20; L0 = Instantiate(CloneRedLight_0, p0, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L0.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L0.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L0.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L1 = Instantiate(CloneRedLight_1, p1, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L1.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L1.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L1.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L2 = Instantiate(CloneRedLight_2, p2, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L2.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L2.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L2.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L3 = Instantiate(CloneRedLight_3, p3, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L3.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L3.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L3.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L4 = Instantiate(CloneRedLight_4, p4, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L4.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L4.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L4.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L5 = Instantiate(CloneRedLight_5, p5, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L5.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L5.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L5.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L6 = Instantiate(CloneRedLight_6, p6, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L6.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L6.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L6.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L7 = Instantiate(CloneRedLight_7, p7, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L7.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L7.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L7.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L8 = Instantiate(CloneRedLight_8, p8, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L8.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L8.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L8.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L9 = Instantiate(CloneRedLight_9, p9, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L9.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L9.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L9.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L10 = Instantiate(CloneRedLight_10, p10, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L10.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L10.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L10.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L11 = Instantiate(CloneRedLight_11, p11, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L11.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L11.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L11.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L12 = Instantiate(CloneRedLight_12, p12, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L12.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L12.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L12.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L13 = Instantiate(CloneRedLight_13, p13, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L13.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L13.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L13.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L14 = Instantiate(CloneRedLight_14, p14, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L14.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L14.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L14.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; ///////////////////////////////////////// L15 = Instantiate(CloneRedLight_15, p15, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L15.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L15.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L15.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L16 = Instantiate(CloneRedLight_16, p16, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L16.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L16.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L16.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L17 = Instantiate(CloneRedLight_17, p17, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L17.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L17.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L17.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; L18 = Instantiate(CloneRedLight_18, p18, this.gameObject.transform.GetChild(ChildCount - 2).transform.rotation, LightManager.transform); L18.GetComponent <RedLightPos>().Obj1 = this.gameObject.transform.GetChild(ChildCount - 2).gameObject; L18.GetComponent <RedLightPos>().Obj2 = this.gameObject.transform.GetChild(ChildCount - 1).gameObject; L18.GetComponent <RedLightPos>().Current_Num = ChildCount - 2; } //WayPoint.Add(tmp); //Debug.Log("InstantiateInstantiateInstantiateInstantiateInstantiateInstantiate"); } /* Line Process*/ ChildCount = this.transform.childCount; lineRenderer.SetVertexCount(ChildCount); if (ChildCount > 1) { for (int i = 0; i < ChildCount; i++) { tmp = this.gameObject.transform.GetChild(i).gameObject; lineRenderer.SetPosition(i, tmp.transform.position); } /*Obstacle Detect*/ for (int i = 0; i < ChildCount - 1; i++) { Obj1 = this.gameObject.transform.GetChild(i).gameObject; Obj2 = this.gameObject.transform.GetChild(i + 1).gameObject; Ray ray = new Ray(Obj1.transform.position, Obj2.transform.position - Obj1.transform.position); RaycastHit hit; //Debug.Log( i + " -> " + (i+1) + " distance : " + Vector3.Distance(Obj1.transform.position, Obj2.transform.position)); float distance = Vector3.Distance(Obj1.transform.position, Obj2.transform.position) - 0.1f; Physics.Raycast(ray, out hit, distance, mask); //When collision is NOT NULL, there is obstacles if (hit.transform != null) { lineRenderer.material = LineMat2; // if collision the line become red //Debug.Log("BBBBBBBBB"); //LineCollision = false; // Let Other Script Know Collision State //LineCollisionNum = i + 1; Debug.Log("Blocked by : " + hit.transform.name); } //If is NULL -> No Obstacles else if (hit.transform == null) { lineRenderer.material = LineMat1; //LineCollision = true; //LineCollisionNum = -1; //Debug.Log("NNNNNNNNN"); } //Debug.Log("Line color : " + lineRenderer.material); } } //if(ChildCount == 2) lineRenderer.SetPosition(2, new Vector3(0,0,1)); }