Как я могу понять все мысли в кривой CGPath или квадратической кривой

Итак, вам нужна отдельная переменная для хранения текущего типа представления (двоичное / восьмеричное / десятичное / шестнадцатеричное)

В вашем коде оно должно выглядеть следующим образом:

private static final int BINARY = 2; // probably use enum
private static final int OCTAL = 8; // probably use enum
private static final int DECIMAL = 10; // probably use enum
private JTextField textField;
private JButton n1, n2, n3, n4, n5, n6, n7, n8, n9, n0, add, subtract, multiply, divide, clear, backspace, bin, dec, oct, hex;
private JPanel panel, panel1, p;
private int system = DECIMAL;

// initialization code

public void actionPerformed(ActionEvent event)
{
    if(event.getSource() == bin){
        system = BINARY;
    } else if (event.getSource() == dec) {
        system = DECIMAL;
    } // same for other systems.

    if (system == BINARY) {
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
    } else if (system == DECIMAL) {
        if(event.getSource() == n1){
            textField.setText(textField.getText() + "1");
        }
        else if(event.getSource() == n2){
            textField.setText(textField.getText() + "2");
        }
        else if(event.getSource() == n3){
            textField.setText(textField.getText() + "3");
        }
        else if(event.getSource() == n4){
            textField.setText(textField.getText() + "4");
        }
        else if(event.getSource() == n5){
            textField.setText(textField.getText() + "5");
        }
        else if(event.getSource() == n6){
            textField.setText(textField.getText() + "6");
        }
        else if(event.getSource() == n7){
            textField.setText(textField.getText() + "7");
        }
        else if(event.getSource() == n8){
            textField.setText(textField.getText() + "8");
        }
        else if(event.getSource() == n9){
            textField.setText(textField.getText() + "9");
        }
        else if(event.getSource() == n0){
            textField.setText(textField.getText() + "0");
        }
        else if(event.getSource() == add){
            textField.setText(textField.getText() + " + ");
        }
        else if(event.getSource() == subtract){
            textField.setText(textField.getText() + " - ");
        }
        else if(event.getSource() == multiply){
            textField.setText(textField.getText() + " * ");
        }
        else if(event.getSource() == divide){
            textField.setText(textField.getText() + " / ");
        }
        else if(event.getSource() == clear){
            textField.setText("");
        }
    } // same for other systems
}

Обратите внимание : лучше предоставить отдельный обработчик для любой кнопки. Например, вы можете сделать это, используя лямбды. В этом случае вам не нужны огромные блоки if-else-if

18
задан Leo 20 September 2016 в 05:59
поделиться

4 ответа

Квадратичная кривая и есть кривая. Невозможно получить список всех точек на нем, потому что на нем бесконечно много точек, и это не простой отрезок.

См. Получение информации о кварцевых путях для список функций, которые можно использовать для запроса объекта CGPath . К сожалению, кажется, что наиболее полезную информацию вы получите с помощью CGPathContainsPoint () , который только сообщает вам, содержится ли данная точка в области пути.

0
ответ дан 30 November 2019 в 09:11
поделиться

If you want to work on the moveto, lineto, and curveto elements of the path, use CGPathApply. You pass this a pointer to a function in your program, and it calls that function once per element of the path.

Unfortunately, there's no way to just ask for each element like there is with AppKit's NSBezierPath. The function is the only way.

If you want to determine every pixel intersected by the path, too bad—that's not practical, and I can't even think of why you'd want that information. Some contexts, such as PDF contexts, don't even have pixels; in those cases, any question involving pixels is a non sequitur.

1
ответ дан 30 November 2019 в 09:11
поделиться

Если нет, у вас есть другое решение для математического получения всех точек кривой.

Для чего они вам нужны, то есть какую проблему вы пытаетесь решить? Если нужно пересечь две кривые, вы можете сделать это математически. Просто приравняйте два уравнения кривых друг к другу и решите неизвестное.

0
ответ дан 30 November 2019 в 09:11
поделиться

Думаю, вам нужно что-то эквивалентное классу Java2D FlatteningPathIterator. Например, Java2D path.getPathIterator (null, 1.0) возвращает итератор только сегментов 'lineTo', даже если исходный путь имел кривыеTo и quadTo, аргумент double управляет 'плоскостностью', давая вам простой способ для вычисления любой точки на кривой. Я ищу то же самое в Какао, но ничего не нашел. Если вы найдете решение, дайте мне знать. Существуют имплантации кривых (например, http://sourceforge.net/projects/curves/ ), которые можно перенести, но всегда есть риск, что если вы не используете тот же алгоритм, что и Какао, тогда там могут быть ошибки между вашей интерполяцией и обведенным NSBezierPath / CGPath.

0
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: