-1

I am porting some Java code to Python and am stuck with the following conditional statment in Java. Any help would be greatly appreciated.

if (xGrad * yGrad <= (float) 0 /*(1)*/
                    ? Math.abs(xGrad) >= Math.abs(yGrad) /*(2)*/
                        ? (tmp = Math.abs(xGrad * gradMag)) >= Math.abs(yGrad * neMag - (xGrad + yGrad) * eMag) /*(3)*/
                            && tmp > Math.abs(yGrad * swMag - (xGrad + yGrad) * wMag) /*(4)*/
                        : (tmp = Math.abs(yGrad * gradMag)) >= Math.abs(xGrad * neMag - (yGrad + xGrad) * nMag) /*(3)*/
                            && tmp > Math.abs(xGrad * swMag - (yGrad + xGrad) * sMag) /*(4)*/
                    : Math.abs(xGrad) >= Math.abs(yGrad) /*(2)*/
                        ? (tmp = Math.abs(xGrad * gradMag)) >= Math.abs(yGrad * seMag + (xGrad - yGrad) * eMag) /*(3)*/
                            && tmp > Math.abs(yGrad * nwMag + (xGrad - yGrad) * wMag) /*(4)*/
                        : (tmp = Math.abs(yGrad * gradMag)) >= Math.abs(xGrad * seMag + (yGrad - xGrad) * sMag) /*(3)*/
                            && tmp > Math.abs(xGrad * nwMag + (yGrad - xGrad) * nMag) /*(4)*/
                    ) {
                    magnitude[index] = gradMag >= MAGNITUDE_LIMIT ? MAGNITUDE_MAX : (int) (MAGNITUDE_SCALE * gradMag);
                } else {
                    magnitude[index] = 0;
                }
Arvind Kumar Avinash
  • 71,965
  • 6
  • 74
  • 110
  • 3
    Have you tried anything yet? Where exactly are you stuck? – Mureinik Mar 28 '20 at 20:27
  • I am unfamiliar with the ? and : nominclature. – Paul Ludington Mar 28 '20 at 20:30
  • Try reading up on the [http://tutorials.jenkov.com/java/ternary-operator.html] (ternary operator) – Monopole Magnet Mar 28 '20 at 20:33
  • Found the page. Very helpful. Thanks. I think I understand the basic operation of the ternary operation in Java. Need some help blocking our the complicated Java conditional statement. Thanks. – Paul Ludington Mar 28 '20 at 20:40
  • 1
    Does this answer your question? [What is the Java ?: operator called and what does it do?](https://stackoverflow.com/questions/798545/what-is-the-java-operator-called-and-what-does-it-do) – AMC Mar 28 '20 at 21:13
  • https://stackoverflow.com/questions/10336899/what-is-a-question-mark-and-colon-operator-used-for – AMC Mar 28 '20 at 21:13

2 Answers2

0

OMG, are you serious?

I would try to split the ternaries into regular if-statements:

boolean update = false;
if (xGrad * yGrad <= 0) {
    if (Math.abs(xGrad) >= Math.abs(yGrad) /*(2)*/
            ? (tmp = Math.abs(xGrad * gradMag)) >= Math.abs(yGrad * neMag - (xGrad + yGrad) * eMag) /*(3)*/
                && tmp > Math.abs(yGrad * swMag - (xGrad + yGrad) * wMag) /*(4)*/
            : (tmp = Math.abs(yGrad * gradMag)) >= Math.abs(xGrad * neMag - (yGrad + xGrad) * nMag) /*(3)*/
                && tmp > Math.abs(xGrad * swMag - (yGrad + xGrad)  /*(4)*/)
        update = true;
} else {
    if (Math.abs(xGrad) >= Math.abs(yGrad) /*(2)*/
            ? (tmp = Math.abs(xGrad * gradMag)) >= Math.abs(yGrad * seMag + (xGrad - yGrad) * eMag) /*(3)*/
                && tmp > Math.abs(yGrad * nwMag + (xGrad - yGrad) * wMag) /*(4)*/
            : (tmp = Math.abs(yGrad * gradMag)) >= Math.abs(xGrad * seMag + (yGrad - xGrad) * sMag) /*(3)*/
                && tmp > Math.abs(xGrad * nwMag + (yGrad - xGrad) * nMag) /*(4)*/)
        update = true;
}
if (update) {
    magnitude[index] = gradMag >= MAGNITUDE_LIMIT ? MAGNITUDE_MAX : (int) (MAGNITUDE_SCALE * gradMag);
} else {
    magnitude[index] = 0;
}

and then repeat this process until all ternaries are reduced into nested if-statements.

Thomas Kläger
  • 17,754
  • 3
  • 23
  • 34
0

Here, this may make it easier for you.

        String expression = """         
        if (xGrad * yGrad <= (float) 0 /* (1) */
                ? Math.abs(xGrad) >= Math.abs(yGrad) /* (2) */
                        ? (tmp = Math.abs(xGrad * gradMag)) >= Math
                                .abs(yGrad * neMag - (xGrad + yGrad)
                                        * eMag) /* (3) */
                                && tmp > Math.abs(yGrad * swMag
                                        - (xGrad + yGrad)
                                                * wMag) /* (4) */
                        :
                        (tmp = Math.abs(yGrad * gradMag)) >= Math
                                .abs(xGrad * neMag - (yGrad + xGrad)
                                        * nMag) /* (3) */
                                && tmp > Math.abs(xGrad * swMag
                                        - (yGrad + xGrad)
                                                * sMag) /* (4) */
                : Math.abs(xGrad) >= Math.abs(yGrad) /* (2) */
                        ? (tmp = Math.abs(xGrad * gradMag)) >= Math
                                .abs(yGrad * seMag + (xGrad - yGrad)
                                        * eMag) /* (3) */
                            && tmp > Math.abs(yGrad * nwMag
                                        + (xGrad - yGrad)
                                                * wMag) /* (4) */
                :
                (tmp = Math.abs(yGrad * gradMag)) >= Math
                        .abs(xGrad * seMag
                                + (yGrad - xGrad) * sMag) /* (3) */
                        && tmp > Math.abs(xGrad * nwMag
                                + (yGrad - xGrad) * nMag) /* (4) */
        ) 
        """;

        String[] parts = expression.replaceAll("\\s+","").replaceAll("([?:])", "#$1#").split("#");

        for (String part : parts) {
            String subParts[] = part.split("&&");
            int len = subParts.length;
            System.out.print(subParts[0]);
            if (len > 1) {
                for (int i = 1; i < subParts.length; i++) {
                    System.out.println(" && \n" + subParts[i]);
                }
            }
            System.out.println();
        }

WJS
  • 36,363
  • 4
  • 24
  • 39
  • It seems like the complex statement distills to: condition ? true ? true : false : false ? true : false. This doesn't make sense to me. Thanks for your help! – Paul Ludington Mar 30 '20 at 12:54