/
vorotov.a.vikt
/
MathEquGen
Обзор
Документация
Войти
/
vorotov.a.vikt
/
MathEquGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/main/java/com/example/chat/latex/LatexEquationGenerator.java
216 строк
9 KB
DudnikSlava
Бот, генерирующий уравнения как на картинках с дополнительными требованиями
18 ноя 2025, 21:58
18 ноя 2025, 21:58
090473d
Код
Авторство
О чём код?
package com.example.chat.latex; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.geom.RoundRectangle2D; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.scilab.forge.jlatexmath.TeXConstants; import org.scilab.forge.jlatexmath.TeXFormula; import org.scilab.forge.jlatexmath.TeXIcon; public class LatexEquationGenerator { public static class Equation { String equation; String answer; public Equation(String equation, String answer) { this.equation = equation; this.answer = answer; } } public static void main(String[] args) { // Создаем список уравнений и ответов в формате LaTeX List<Equation> equations = new ArrayList<>(); equations.add(new Equation("x^2 + 2x + 1 = 0", "x = -1")); equations.add(new Equation("2x - 5 = 3", "x = 4")); equations.add(new Equation("3(x + 2) = 15", "x = 3")); equations.add(new Equation("x^2 - 4 = 0", "x = \\pm 2")); equations.add(new Equation("\\frac{x}{2} + 3 = 7", "x = 8")); equations.add(new Equation("2x^2 + 3x - 2 = 0", "x = \\frac{1}{2}, -2")); equations.add(new Equation("4x - 7 = 2x + 3", "x = 5")); equations.add(new Equation("x^3 - 8 = 0", "x = 2")); equations.add(new Equation("\\sqrt{x + 3} = 4", "x = 13")); // equations.add(new Equation("2^x = 16", "x = 4")); // equations.add(new Equation("\\frac{1}{x} + \\frac{1}{x+\\frac{1}{x}} = \\frac{1}{2}", "x = 1")); // equations.add(new Equation("\\int_0^1 x^2 \\, dx", "\\frac{1}{3}")); // equations.add(new Equation("\\sum_{n=1}^\\infty \\frac{1}{n^2}", "\\frac{\\pi^2}{6}")); // equations.add(new Equation("\\lim_{x \\to 0} \\frac{\\sin x}{x}", "1")); // equations.add(new Equation("\\binom{n}{k} = \\frac{n!}{k!(n-k)!}", "C_n^k")); // Генерируем изображение generateEquationImage(equations, "equations_output.png"); } // Метод для преобразования LaTeX в изображение public static BufferedImage latexToImage(String latex, int fontSize, Color color) { try { // Создаем TeXFormula из LaTeX строки TeXFormula formula = new TeXFormula(latex); // Создаем TeXIcon с указанным размером шрифта TeXIcon icon = formula.createTeXIcon(TeXConstants.STYLE_DISPLAY, fontSize); // Создаем изображение BufferedImage image = new BufferedImage( icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB ); // Получаем Graphics2D для рисования Graphics2D g2d = image.createGraphics(); // Настройка сглаживания g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // Устанавливаем цвет g2d.setColor(color); // Рисуем формулу icon.paintIcon(null, g2d, 0, 0); g2d.dispose(); return image; } catch (Exception e) { System.err.println("Ошибка рендеринга LaTeX: " + latex + " - " + e.getMessage()); return createErrorImage(latex, fontSize); } } // Создаем изображение с сообщением об ошибке private static BufferedImage createErrorImage(String latex, int fontSize) { int width = 300; int height = 40; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); g2d.setColor(Color.RED); g2d.setFont(new Font("Arial", Font.PLAIN, 12)); String errorText = "Error: " + (latex.length() > 30 ? latex.substring(0, 30) + "..." : latex); g2d.drawString(errorText, 10, 20); g2d.dispose(); return image; } public static void generateEquationImage(List<Equation> equations, String filename) { // Параметры изображения int width = 1600; int margin = 50; int columnWidth = (width - 3 * margin) / 2; int rowHeight = 120; // Автоматическая высота изображения int height = margin + 60 + equations.size() * rowHeight + 30; // Уменьшил высоту из-за удаленных элементов // Создаем основное изображение BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); // Настройка сглаживания g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); // Заливаем фон g2d.setColor(new Color(255, 253, 250)); g2d.fillRect(0, 0, width, height); // Устанавливаем шрифты для текста Font numberFont = new Font("Arial", Font.BOLD, 30); // Рисуем уравнения и ответы int startY = margin + 30; // Уменьшил начальную позицию for (int i = 0; i < equations.size(); i++) { Equation eq = equations.get(i); int y = startY + i * rowHeight; // Рисуем номер с увеличенным отступом g2d.setFont(numberFont); g2d.setColor(new Color(80, 80, 100)); String number = (i + 1) + ")"; g2d.drawString(number, margin + 30, y + 10); // Левый столбец - уравнения int equationX = margin + 80; // Размеры прямоугольника double rectWidth = columnWidth - 60; double rectHeight = 105; // Фон для уравнения g2d.setColor(new Color(240, 245, 255)); g2d.fill(new RoundRectangle2D.Double(equationX - 10, y - rectHeight/2, rectWidth, rectHeight, 15, 15)); // Граница уравнения g2d.setColor(new Color(180, 200, 240)); g2d.setStroke(new BasicStroke(2f)); g2d.draw(new RoundRectangle2D.Double(equationX - 10, y - rectHeight/2, rectWidth, rectHeight, 15, 15)); // Рендерим LaTeX уравнение try { BufferedImage equationImage = latexToImage(eq.equation, 30, new Color(0, 0, 80)); if (equationImage != null) { int imgX = equationX + 20; int imgY = y - equationImage.getHeight() / 2; g2d.drawImage(equationImage, imgX, imgY, null); } } catch (Exception e) { System.err.println("Ошибка при рендеринге уравнения: " + eq.equation); e.printStackTrace(); } // Правый столбец - ответы int answerX = margin + columnWidth + margin + 40; // Фон для ответа g2d.setColor(new Color(255, 240, 240)); g2d.fill(new RoundRectangle2D.Double(answerX - 10, y - rectHeight/2, rectWidth, rectHeight, 15, 15)); // Граница ответа g2d.setColor(new Color(240, 180, 180)); g2d.draw(new RoundRectangle2D.Double(answerX - 10, y - rectHeight/2, rectWidth, rectHeight, 15, 15)); // Рендерим LaTeX ответ try { BufferedImage answerImage = latexToImage(eq.answer, 30, new Color(100, 0, 0)); if (answerImage != null) { int imgX = answerX + 20; int imgY = y - answerImage.getHeight() / 2; g2d.drawImage(answerImage, imgX, imgY, null); } } catch (Exception e) { System.err.println("Ошибка при рендеринге ответа: " + eq.answer); e.printStackTrace(); } } // Освобождаем ресурсы g2d.dispose(); // Сохраняем изображение try { ImageIO.write(image, "png", new File(filename)); System.out.println("✅ Изображение успешно сохранено как: " + filename); System.out.println("📏 Размер: " + width + "x" + height + " пикселей"); System.out.println("📊 Количество уравнений: " + equations.size()); System.out.println("🔧 Используемая библиотека: JLaTeXMath"); } catch (IOException e) { System.err.println("❌ Ошибка при сохранении изображения: " + e.getMessage()); } } }