public void KarnaughTableObject(CKarnaughTable newObject) { if (newObject.GetTableType() == EKarnaughTableType.Karnaugh3Var) { // 3 var table m_rowsCount = 2; m_strLableBits_Rows[0] = "0"; m_strLableBits_Rows[1] = "1"; } else { // 4 var table m_rowsCount = 4; m_strLableBits_Rows[0] = "00"; m_strLableBits_Rows[1] = "01"; } m_objKarnaugh = newObject; CalculateCellsLocation(); this.Invalidate(); }
private Rectangle[] GetGroupRegions(SKarnaughGroup group) { Rectangle[] reg; if (group.Type == EGroupTypes.RectGroup_4 && group.Location == 10) { #region We must return 4 region reg = new Rectangle[4]; reg[0] = GetMintermLocation(0); reg[1] = GetMintermLocation(2); reg[2] = GetMintermLocation(8); reg[3] = GetMintermLocation(10); #endregion } else if ((group.Location % 4 == 2 && (group.Type == EGroupTypes.LinerGroup_2_Hor || group.Type == EGroupTypes.RectGroup_4 || group.Type == EGroupTypes.RectGroup_8_Ver)) || ((group.Location >= 8 && group.Location <= 11) && (group.Type == EGroupTypes.LinerGroup_2_Ver || group.Type == EGroupTypes.RectGroup_4 || group.Type == EGroupTypes.RectGroup_8_Hor))) { #region We must return 2 region reg = new Rectangle[2]; SKarnaughGroup g1, g2; Rectangle[] reg1; Rectangle[] reg2; switch (group.Type) { case EGroupTypes.RectGroup_8_Ver: g1.Type = g2.Type = EGroupTypes.LinerGroup_4_Ver; g1.Location = 0; g2.Location = 2; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; break; case EGroupTypes.RectGroup_8_Hor: g1.Type = g2.Type = EGroupTypes.LinerGroup_4_Hor; g1.Location = 0; g2.Location = 8; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; break; case EGroupTypes.RectGroup_4: if (group.Location == 2 || group.Location == 6 || group.Location == 14) { g1.Type = g2.Type = EGroupTypes.LinerGroup_2_Ver; g1.Location = group.Location - 2; g2.Location = group.Location; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; } else if (group.Location == 8 || group.Location == 9 || group.Location == 11) { g1.Type = g2.Type = EGroupTypes.LinerGroup_2_Hor; g1.Location = group.Location - 8; g2.Location = group.Location; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; } break; case EGroupTypes.LinerGroup_2_Hor: g1.Type = g2.Type = EGroupTypes.SingleMinterm; g1.Location = group.Location - 2; g2.Location = group.Location; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; break; case EGroupTypes.LinerGroup_2_Ver: g1.Type = g2.Type = EGroupTypes.SingleMinterm; g1.Location = group.Location - 8; g2.Location = group.Location; reg1 = GetGroupRegions(g1); reg2 = GetGroupRegions(g2); reg[0] = reg1[0]; reg[1] = reg2[0]; break; } #endregion } else { #region We must return 1 region Rectangle currentRegion; int[] mintermIndexes = CKarnaughTable.GetMintermsIndexes(CKarnaughTable.GetMintermsInsideGroup(group)); int regionsCount = mintermIndexes.GetLength(0); reg = new Rectangle[1]; reg[0] = GetMintermLocation(mintermIndexes[0]); for (int i = 1; i < regionsCount; i++) { currentRegion = GetMintermLocation(mintermIndexes[i]); if (currentRegion.Left < reg[0].Left) { reg[0].X = currentRegion.Left; } if (currentRegion.Top < reg[0].Top) { reg[0].Y = currentRegion.Top; } if (currentRegion.Right > reg[0].Right) { reg[0].Width = currentRegion.Right - reg[0].Left; } if (currentRegion.Bottom > reg[0].Bottom) { reg[0].Height = currentRegion.Bottom - reg[0].Top; } } #endregion } return(reg); }