AndVGri
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору '=== Создать класс с именем LineClass === Код: Public A As Double Public B As Double Public C As Double Public NextItem As LineClass | '=== End Class === Код в модуле, где процедуре CalcIntersect передаются пути и имена входного и выходного файлов Код: Private Sub ReadCoefficients(ByVal FileName As String, ByRef toRoot As LineClass) Dim fNum As Integer, Item As LineClass Dim vA As Double, vB As Double, vC As Double 'открываем файл на чтение fNum = FreeFile() Open FileName For Input As #fNum Do Until EOF(fNum) 'до конца файла читаем параметры прямых в список Set Item = New LineClass Input #fNum, vA, vB, vC Item.A = vA: Item.B = vB: Item.C = vC Set Item.NextItem = toRoot Set toRoot = Item Loop Close #fNum End Sub Public Sub CalcIntersection(ByVal InputFile As String, ByVal OutputFile As String) Dim pRoot As LineClass, fOut As Integer Dim pCurrentLine As LineClass, pNextLine As LineClass Dim vX As Double, vY As Double, vP As Double 'читаем список параметров прямых Call ReadCoefficients(InputFile, pRoot) 'открываем файл результата на запись fOut = FreeFile() Open OutputFile For Output As #fOut Set pCurrentLine = pRoot 'ссылка на 1-ую прямую списка параметров 'по всему списку параметров прямых Do Until pCurrentLine Is Nothing 'вычисляем точку пересечения текущей прямой со всеми последующими Set pNextLine = pCurrentLine.NextItem Do Until pNextLine Is Nothing vP = pCurrentLine.A * pNextLine.B - pCurrentLine.B * pNextLine.A 'если прямые не параллельны, то вычислим точку пересечения If Math.Abs(vP) > 1E-100 Then vX = (pCurrentLine.B * pNextLine.C - pCurrentLine.C * pNextLine.B) / vP vY = (pCurrentLine.C * pNextLine.A - pCurrentLine.A * pNextLine.C) / vP Write #fOut, vX, vY End If Set pNextLine = pNextLine.NextItem 'к следующей прямой Loop 'переход к следующей прямой, для которой вычисляем точку пересечения Set pCurrentLine = pCurrentLine.NextItem Loop Close #fOut End Sub | |