//Получение индекса пересеченного слова по номеру символа internal int GetCrossedIndex(Word _Word, int _Index) { int x = _Word.X; int y = _Word.Y; int xp = 0; int yp = 0; if (_Word.Direction == EWordDirection.wdHorizontal) { xp = 1; yp = 0; } else { xp = 0; yp = 1; } x = x + xp * _Index; y = y + yp * _Index; string _Key = WordIntersection.GetKey(x, y); if (m_Intersections.ContainsKey(_Key)) { return(m_Intersections[_Key].CrossedBy(_Word).Index); } return(-1); }
//Очистка значения слова с сохранением символов в местах пересечений. Значения символов определяются по соответствующим пересечениям. public void ClearValue(Word _Word, bool _UpdateCrosses) { _Word.Null(); _Word.IsDefined = false; if (!_UpdateCrosses) { return; } int x = _Word.X; int y = _Word.Y; int xp = 0; int yp = 0; if (_Word.Direction == EWordDirection.wdHorizontal) { xp = 1; yp = 0; } else { xp = 0; yp = 1; } for (int i = 0; i < _Word.Length; i++) { string _Key = WordIntersection.GetKey(x, y); if (m_Intersections.ContainsKey(_Key)) { WordIntersection _Intersection = m_Intersections[_Key]; Word _CrossedWord = _Intersection.CrossedBy(_Word); if (_CrossedWord.IsDefined) { if (_CrossedWord.Direction == EWordDirection.wdHorizontal) { _Word[i] = _CrossedWord[x - _CrossedWord.X]; } else { _Word[i] = _CrossedWord[y - _CrossedWord.Y]; } } } x += xp; y += yp; } }
//Выделение слов по горизонтали и вертикали в отдельные списки, вычисление пересечений слов. internal void Prepare() { m_Intersections = new Dictionary <string, WordIntersection>(); m_WordsH = new Words(); m_WordsV = new Words(); foreach (Word _Word in this) { if (_Word.Direction == EWordDirection.wdHorizontal) { m_WordsH.Add(_Word); } else { m_WordsV.Add(_Word); } } foreach (Word _WordH in m_WordsH) { foreach (Word _WordV in m_WordsV) { if (_WordH.X <= _WordV.X && _WordH.X + _WordH.Length >= _WordV.X) { if (_WordV.Y <= _WordH.Y && _WordV.Y + _WordV.Length >= _WordH.Y) { WordIntersection _Intersection = new WordIntersection(); _Intersection.X = _WordV.X; _Intersection.Y = _WordH.Y; _Intersection.WordH = _WordH; _Intersection.WordV = _WordV; m_Intersections.Add(_Intersection.Key, _Intersection); } } } } }