Mmm, the reference of sub() isn't very clear, mixing two or three versions, letting the reader to guess what returns "none" and what returns a PVector. loc_2[i].sub(loc_2[i+1]) just alters the first first vector by subtracting the second one. If you don't want to change them, you have to use the static version: PVector perp0 = PVector.sub(loc_2[i], loc_2[i+1]);
I guess the error you might have with first version is
cannot convert from void to PVector. That is because normalize() without any parameters will return void. And you are expecting to have a PVector to store in perp1.
For the second version phi.lho is right. You can't call cross() as a static method, so PVector.cross(...) will not work.
So, you could split your assignment in two lines like :