# predicte

Hi All,

one answer for the local bodies is we can use the following code:
###
The same for interactions (e.g. based on their contactPoint):
###
predicate = pack.inAlignedBox(...)
localIntrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]

#################
I did the same way, here is my code:
def local_interaction():
predicate = pack.inAlignedBox((0.1,0.1,0.1),(0.15,0.15,0.15))
#predicate = pack.inSphere((0.2,0.2,0.1), 0.1)
localintrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]
for i in localintrs:
constnormal1 = i.geom.normal[0]
constnormal2 = i.geom.normal[1]
constnormal3 = i.geom.normal[2]
print('this is contact normal 1:',constnormal1)
print('this is contact normal 2:',constnormal2)
print('this is contact normal 3:',constnormal3)
###############but I got the error:
In [1]: ---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)

40 predicate = pack.inAlignedBox((0.1,0.1,0.1),(0.15,0.15,0.15))
41 #predicate = pack.inSphere((0.2,0.2,0.1), 0.1)
---> 42 localintrs = [i for i in O.interactions if predicate(i.geom.contactPoint)]
43 for i in localintrs:
44 constnormal1 = i.geom.normal[0]

ArgumentError: Python argument types in
Predicate.__call__(inAlignedBox, Vector3)
did not match C++ signature:
__call__(PredicateWrap {lvalue}, Eigen::Matrix<double, 3, 1, 0, 3, 1>, double)
__call__(Predicate {lvalue}, Eigen::Matrix<double, 3, 1, 0, 3, 1>, double)
###############
sorry, I don't know the error, but i know it's related to line 42 "if predicate(i.geom.contactPoint)]-------------here"
it seems i need to add something here.
######################
if we use another code post at that question.
###
predicate = pack.inAlignedBox(...) # or other instance or combination of several predicates
localBodies = [b for b in O.bodies if predicate(b.state.pos,b.shape.radius)]
###
these code didn't give me error.
but if i change here----------------if predicate(b.state.pos,b.shape.radius)]------to-------if predicate(b.state.pos)], it will give me the same error.
for these code, i think we need the position as well as the radius to identify one sphere, so we need:b.state.pos,b.shape.radius.
but for an interaction point, why we can't just use i.geom.contactPoint to determine the contact point is in this predicate or not?

overall, I think my question is how to use the predicate to determine whether a contact point is in this predicate or not?

thanks
Yong

## Question information

Language:
English Edit question
Status:
Solved
For:
Assignee:
No assignee Edit question
Solved by:
Jan Stránský
Solved:
2020-04-29
Last query:
2020-04-29
2020-04-28
 Jan Stránský (honzik) said on 2020-04-28: #1

calling predicate needs two parameters, point and "radius"
if you are interested merely in the position, pass 0 as the second argument.
The documentation of this should be improved, see issue [1]
cheers
Jan

 ytang (ytang116) said on 2020-04-29: #2

Hi Jan,

thank you very much! it works!

 ytang (ytang116) said on 2020-04-29: #3

Thanks Jan Stránský, that solved my question.